JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr{ gilour

File "445-es2015.0571e61aeb32d1a410f2.js-20260314162958.map"

Full Path: /home/markqprx/iniasli.pro/public/client/445-es2015.0571e61aeb32d1a410f2.js-20260314162958.map
File size: 1.7 MB
MIME-type: text/plain
Charset: utf-8

{"version":3,"sources":["node_modules/rxjs/_esm2015/internal/observable/interval.js","node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/drag-drop.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/autocomplete.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/button-toggle.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/chips.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/radio.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/slide-toggle.js","node_modules/chartist-plugin-tooltips-updated/dist/chartist-plugin-tooltip.js","node_modules/chartist/dist/chartist.js","node_modules/fast-deep-equal/index.js","src/app/dashboard/biolinks/biolink-editor/widgets/biolink-widgets.service.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor.service.ts","src/app/dashboard/biolinks/biolink-editor/widgets/image-widget-modal/image-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/image-widget-modal/image-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/youtube-widget-modal/youtube-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/youtube-widget-modal/youtube-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/soundcloud-widget-modal/soundcloud-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/soundcloud-widget-modal/soundcloud-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/vimeo-widget-modal/vimeo-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/vimeo-widget-modal/vimeo-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/spotify-widget-modal/spotify-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/spotify-widget-modal/spotify-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/twitch-widget-modal/twitch-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/twitch-widget-modal/twitch-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/tiktok-widget-modal/tiktok-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/tiktok-widget-modal/tiktok-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/text-widget-modal/text-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/socials-widget-modal/socials-widget-services.ts","src/app/dashboard/biolinks/biolink-editor/widgets/socials-widget-modal/socials-widget-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/widget-list.ts","src/app/dashboard/biolinks/biolink-editor/widgets/text-widget-modal/text-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/socials-widget-modal/socials-widget-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/widgets/widget-list-modal/widget-list-modal.component.html","src/app/dashboard/biolinks/biolink-editor/widgets/widget-list-modal/widget-list-modal.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-slideout-panel/biolink-slideout-panel.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-slideout-panel/biolink-slideout-panel.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/animation-selector/animation-list.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/animation-selector/animation-selector.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/animation-selector/animation-selector.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/leap-link-panel/leap-link-panel.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/leap-link-panel/leap-link-panel.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/link-thumbnail-panel/link-thumbnail-panel.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/link-thumbnail-panel/link-thumbnail-panel.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/biolink-editor-link.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-link/biolink-editor-link.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-widget/biolink-editor-widget.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-widget/biolink-editor-widget.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-content.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor-content/biolink-editor-content.component.ts","src/common/shared/form-controls/background-selector/background-list.ts","src/common/shared/form-controls/background-selector/background-selector-gradient/gradient-list.ts","src/common/shared/form-controls/background-selector/background-selector-gradient/background-selector-gradient.component.html","src/common/shared/form-controls/background-selector/background-selector-gradient/background-selector-gradient.component.ts","src/common/shared/form-controls/background-selector/background-selector-img/background-selector-img.component.ts","src/common/shared/form-controls/background-selector/background-selector-img/background-selector-img.component.html","src/common/shared/form-controls/background-selector/label-from-filename.pipe.ts","src/common/shared/form-controls/background-selector/background-selector.component.html","src/common/shared/form-controls/background-selector/background-selector.component.ts","src/common/shared/form-controls/google-font-selector/browser-safe-fonts.ts","src/common/shared/form-controls/google-font-selector/font-display-name.pipe.ts","src/common/shared/form-controls/google-font-selector/google-font-selector.component.html","src/common/shared/form-controls/google-font-selector/google-font-selector.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-appearance/biolink-editor-fonts/biolink-editor-fonts.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-appearance/biolink-editor-fonts/biolink-editor-fonts.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-appearance/biolink-editor-buttons/biolink-editor-buttons.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-appearance/biolink-editor-buttons/biolink-editor-buttons.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-appearance/biolink-appearance.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-appearance/biolink-appearance.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-settings/biolink-settings.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-settings/biolink-settings.component.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor.component.html","src/app/dashboard/biolinks/biolink-editor/biolink-editor.component.ts","src/app/dashboard/biolinks/biolink-index/biolink-index.component.html","src/app/dashboard/biolinks/biolink-index/biolink-index.component.ts","src/app/dashboard/biolinks/biolinks.service.ts","src/common/core/ui/between-date-input/between-input/between-input.component.ts","src/common/core/ui/between-date-input/between-input/between-input.component.html","src/app/dashboard/click-charts/click-charts.component.html","src/app/dashboard/click-charts/click-charts.component.ts","src/app/dashboard/click-charts/click-charts.module.ts","src/common/workspaces/workspace-selector/workspace-selector.component.html","src/common/workspaces/workspace-selector/workspace-selector.component.ts","src/app/dashboard/dashboard-host/link-usage-info/link-usage-info.component.html","src/app/dashboard/dashboard-host/link-usage-info/link-usage-info.component.ts","src/app/dashboard/dashboard-host/upgrade-panel/upgrade-panel.component.html","src/app/dashboard/dashboard-host/upgrade-panel/upgrade-panel.component.ts","src/app/dashboard/dashboard-host/dashboard-host.component.html","src/app/dashboard/dashboard-host/dashboard-host.component.ts","src/app/shared/link/link-reports-resolver.service.ts","src/app/dashboard/dashboard-home/dashboard-home.component.ts","src/app/dashboard/dashboard-home/dashboard-home.component.html","src/app/dashboard/link-domain/link-domain.component.html","src/app/dashboard/link-domain/link-domain.component.ts","src/app/dashboard/link-page-index/link-page-index.component.html","src/app/dashboard/link-page-index/link-page-index.component.ts","src/app/dashboard/link-page-base-uri.ts","src/app/dashboard/dashboard-host/redirect-to-onboarding.guard.ts","src/common/workspaces/workspace-config.ts","src/common/workspaces/workspace-index/workspace-index.component.html","src/common/workspaces/workspace-index/workspace-index.component.ts","src/app/dashboard/dashboard-routing.module.ts","src/common/custom-domain/custom-domain.module.ts","src/app/dashboard/link/link-type-menu/link-type-menu.component.html","src/app/dashboard/link/link-type-menu/link-type-menu.component.ts","src/common/core/ui/datetime-input/datetime-input.module.ts","src/common/core/ui/enter-keybind.directive.ts","src/common/workspaces/workspace-selector/workspace-selector.module.ts","src/common/shared/form-controls/google-font-selector/google-font-selector.module.ts","src/common/shared/form-controls/background-selector/background-selector.module.ts","src/app/dashboard/link/link-options-form/link-options-form.module.ts","src/app/dashboard/biolinks/biolink-editor/biolink-editor.module.ts","src/app/dashboard/dashboard.module.ts","src/app/dashboard/link-group/crupdate-link-group-modal/crupdate-link-group-modal.component.html","src/app/dashboard/link-group/crupdate-link-group-modal/crupdate-link-group-modal.component.ts","src/app/dashboard/link-group/link-group-analytics-page/link-group-analytics-page.component.html","src/app/dashboard/link-group/link-group-analytics-page/link-group-analytics-page.component.ts","src/app/dashboard/link-group/link-group-index/link-group-index-filters.ts","src/app/dashboard/link-group/link-group-index/link-group-index.component.html","src/app/dashboard/link-group/link-group-index/link-group-index.component.ts","src/app/dashboard/link-group/link-groups-links-index/link-group-links-index.component.ts","src/app/dashboard/link-group/link-groups-links-index/link-group-links-index.component.html","src/app/dashboard/link-overlay/link-overlay-index/crupdate-link-overlay-page/generic-page-preview/generic-page-preview.component.ts","src/app/dashboard/link-overlay/link-overlay-index/crupdate-link-overlay-page/generic-page-preview/generic-page-preview.component.html","src/app/dashboard/link-overlay/link-overlay-index/crupdate-link-overlay-page/crupdate-link-overlay-page.component.html","src/app/dashboard/link-overlay/link-overlay-index/crupdate-link-overlay-page/crupdate-link-overlay-page.component.ts","src/app/dashboard/link-overlay/link-overlay-index/link-overlay-filters.ts","src/app/dashboard/link-overlay/link-overlay-index/link-overlay-index.component.html","src/app/dashboard/link-overlay/link-overlay-index/link-overlay-index.component.ts","src/app/dashboard/link-overlay/link-overlay.service.ts","node_modules/autosize/dist/autosize.esm.js","src/app/dashboard/link/crupdate-link-modal/link-created-message/link-created-message.component.html","src/app/dashboard/link/crupdate-link-modal/link-created-message/link-created-message.component.ts","src/app/dashboard/link/crupdate-link-modal/crupdate-link-modal.component.html","src/app/dashboard/link/crupdate-link-modal/crupdate-link-modal.component.ts","src/app/dashboard/link/crupdate-link-select-values.service.ts","src/app/dashboard/link/types.ts","src/app/dashboard/link/link-index/link-index-filters.ts","src/app/dashboard/link-group/attach-link-modal/attach-link-modal.component.html","src/app/dashboard/link-group/attach-link-modal/attach-link-modal.component.ts","src/app/dashboard/link/link-index/remove-protocol.pipe.ts","src/app/dashboard/link/link-index/link-index.component.html","src/app/dashboard/link/link-index/link-index.component.ts","src/app/dashboard/link/link-options-form/domain-form-control/domain-form-control.component.html","src/app/dashboard/link/link-options-form/domain-form-control/domain-form-control.component.ts","src/app/dashboard/link/utm-builder-dialog/utm-builder-dialog.component.ts","src/app/dashboard/link/utm-builder-dialog/utm-builder-dialog.component.html","src/app/dashboard/link/link-options-form/link-options-form.component.html","src/app/dashboard/link/link-options-form/link-options-form.component.ts","src/app/dashboard/link/link-show/link-show-resolver.service.ts","src/app/dashboard/link/link-show/link-show.component.html","src/app/dashboard/link/link-show/link-show.component.ts","src/app/dashboard/permission-aware-input-container/permission-aware-input-container.component.ts","src/app/dashboard/permission-aware-input-container/permission-aware-input-container.component.html","src/app/dashboard/permissions/simple-permission-overlay/simple-permission-overlay.component.ts","src/app/dashboard/permissions/simple-permission-overlay/simple-permission-overlay-message.ts","src/app/dashboard/permissions/simple-permission-overlay/simple-permission-overlay.component.html","src/app/dashboard/permissions/permission-aware-button/permission-aware-button.component.ts","src/app/dashboard/permissions/permission-aware-button/permission-aware-button.component.html","src/app/dashboard/permissions/upgrade-overlay/upgrade-overlay.component.ts","src/app/dashboard/permissions/upgrade-overlay/upgrade-overlay-message.ts","src/app/dashboard/permissions/upgrade-overlay/upgrade-overlay.component.html","src/app/dashboard/pixels/tracking-pixel.service.ts","src/app/dashboard/pixels/tracking-pixel-types.ts","src/app/dashboard/pixels/crupdate-tracking-pixel-modal/crupdate-tracking-pixel-modal.component.html","src/app/dashboard/pixels/crupdate-tracking-pixel-modal/crupdate-tracking-pixel-modal.component.ts","src/app/dashboard/pixels/tracking-pixel-index/tracking-pixel-filters.ts","src/app/dashboard/pixels/tracking-pixel-index/tracking-pixel-index.component.html","src/app/dashboard/pixels/tracking-pixel-index/tracking-pixel-index.component.ts","src/app/shared/link/link-usage.service.ts","src/app/shared/link/link.form.ts","src/common/admin/appearance/appearance-image-input/appearance-image-upload-validator.ts","src/common/auth/find-user-modal/find-user-modal.component.html","src/common/auth/find-user-modal/find-user-modal.component.ts","src/common/core/ui/between-date-input/between-date-input.module.ts","src/common/core/ui/chips/chip-input/chip-input.component.html","src/common/core/ui/chips/chip-input/chip-input.component.ts","src/common/core/ui/chips/chips.module.ts","src/common/core/ui/color-picker/color-picker-input/color-picker-input.component.ts","src/common/core/ui/color-picker/color-picker-input/color-picker-input.component.html","src/common/core/ui/color-picker/color-picker-input/color-picker-input.module.ts","src/common/core/ui/datetime-input/datetime-input.component.html","src/common/core/ui/datetime-input/datetime-input.component.ts","src/common/core/ui/info-popover/info-popover.component.html","src/common/core/ui/info-popover/info-popover.component.ts","src/common/core/ui/info-popover/info-popover.module.ts","src/common/core/ui/overlay-panel/positions/right-position.ts","src/common/core/ui/select-user-input/select-user-input.module.ts","src/common/core/ui/skeleton/skeleton-animations.ts","src/common/core/utils/remove-null-from-object.ts","src/common/csv/csv-info-dialog/csv-export-info-dialog.component.ts","src/common/csv/csv-info-dialog/csv-export-info-dialog.component.html","src/common/csv/csv-exporter.service.ts","src/common/uploads/utils/download-file-from-url.ts","src/common/csv/csv-info-dialog/csv-export-info-dialog.module.ts","src/common/custom-domain/custom-domain-index/custom-domain-filters.ts","src/common/custom-domain/crupdate-custom-domain-modal/crupdate-custom-domain-modal.component.html","src/common/custom-domain/crupdate-custom-domain-modal/crupdate-custom-domain-modal.component.ts","src/common/custom-domain/custom-domain-index/custom-domain-index.component.html","src/common/custom-domain/custom-domain-index/custom-domain-index.component.ts","src/common/custom-domain/custom-domain.service.ts","src/common/datatable/columns/user-column/user-column.component.html","src/common/datatable/columns/user-column/user-column.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/filter-suggestions/filter-suggestions.component.html","src/common/datatable/datatable-filters/search-input-with-filters/filter-suggestions/filter-suggestions.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/select-model-control/select-model-control.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/select-model-control/select-model-control.component.ts","src/common/datatable/datatable-filters/filter-operator-names.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/operator-select/operator-display-name.pipe.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/operator-select/operator-select.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/operator-select/operator-select.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filter/active-filter.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filter/active-filter.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filters.component.html","src/common/datatable/datatable-filters/search-input-with-filters/active-filters/active-filters.component.ts","src/common/core/keybinds/keycodes.enum.ts","src/common/core/keybinds/keybinds.service.ts","src/common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.component.html","src/common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.component.ts","src/common/datatable/datatable-filters/datatable-filters.component.ts","src/common/datatable/datatable-filters/datatable-filters.component.html","src/common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter.ts","src/common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter.ts","src/common/datatable/datatable-footer/datatable-footer.component.html","src/common/datatable/datatable-footer/datatable-footer.component.ts","src/common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.module.ts","src/common/datatable/datatable.module.ts","src/common/shared/paginator.service.ts","src/common/datatable/utils/sort-datatable-data.ts","src/common/datatable/datatable.service.ts","src/common/datatable/delete-resource-message.ts","src/common/datatable/selection/table-body-checkbox.component.ts","src/common/datatable/selection/table-header-checkbox.component.ts","src/common/datatable/table-sort-header/table-sort-header.component.ts","src/common/datatable/table-sort-header/table-sort-header.component.html","src/common/datatable/utils/filter-datatable-data.ts","src/common/guards/pending-changes/pending-changes-guard.service.ts","src/common/text-editor/editors/tinymce-text-editor.service.ts","src/common/text-editor/validation/text-editor-image-validator.ts","src/common/text-editor/text-editor.component.html","src/common/text-editor/text-editor.component.ts","src/common/pages/custom-pages-index/crupdate-custom-page/crupdate-custom-page.component.html","src/common/pages/custom-pages-index/crupdate-custom-page/crupdate-custom-page.component.ts","src/common/shared/form-controls/slug-control/bind-slug-to.ts","src/common/pages/custom-pages-index/cusomt-page-filters.ts","src/common/pages/custom-pages-index/custom-page-index.module.ts","src/common/pages/custom-pages-index/custom-pages-index.component.html","src/common/pages/custom-pages-index/custom-pages-index.component.ts","src/common/shared/charts/base-chart.ts","src/common/shared/charts/chartist/chartist-line.ts","src/common/shared/charts/chartist/chartist-pie.ts","src/common/shared/charts/chartist/chartist-bar.ts","src/common/shared/charts/chart/chart.component.html","src/common/shared/charts/chart/chart.component.ts","src/common/shared/charts/charts.module.ts","src/common/shared/form-controls/slug-control/slug-control.component.html","src/common/shared/form-controls/slug-control/slug-control.component.ts","src/common/shared/form-controls/slug-control/slug-control.module.ts","node_modules/rxjs/_esm2015/internal/operators/throttle.js","node_modules/rxjs/_esm2015/internal/operators/throttleTime.js","src/common/uploads/upload-progress-bar/upload-progress-bar.component.ts","src/common/uploads/upload-progress-bar/upload-progress-bar.component.html","src/common/uploads/directives/upload-button.directive.ts","src/common/shared/form-controls/upload-image-control/upload-image-control.component.html","src/common/shared/form-controls/upload-image-control/upload-image-control.component.ts","src/common/uploads/uploads.module.ts","src/common/shared/form-controls/upload-image-control/upload-image-control.module.ts","src/common/shared/sidenav/sidenav.component.ts","src/common/shared/sidenav/sidenav.component.html","src/common/shared/sidenav/sidenav.module.ts","src/common/text-editor/text-editor.module.ts","src/common/uploads/types/upload-uri.enum.ts","src/common/uploads/upload-queue/upload-queue-item.ts","src/common/uploads/validation/validations/allowed-extensions-validation.ts","src/common/uploads/validation/validations/blocked-extensions-validation.ts","src/common/uploads/validation/default-upload-validator.ts","src/common/uploads/upload-queue/upload-queue.service.ts","src/common/workspaces/crupdate-workspace-modal/crupdate-workspace-modal.component.html","src/common/workspaces/crupdate-workspace-modal/crupdate-workspace-modal.component.ts","src/common/workspaces/leave-workspace-confirmation.ts","src/common/workspaces/workspace-messages.ts","src/common/workspaces/manage-workspace-members-modal/manage-workspace-members-modal.component.html","src/common/workspaces/manage-workspace-members-modal/manage-workspace-members-modal.component.ts","src/common/workspaces/workspace.module.ts"],"names":["dispatch","state","subscriber","counter","period","next","this","schedule","extendStyles","dest","source","key","hasOwnProperty","toggleNativeDragInteractions","element","enable","userSelect","style","touchAction","webkitUserDrag","webkitTapHighlightColor","msUserSelect","webkitUserSelect","MozUserSelect","toggleVisibility","styles","position","top","opacity","left","parseCssTimeUnitsToMs","value","multiplier","toLowerCase","indexOf","parseFloat","parseCssPropertyValue","computedStyle","name","getPropertyValue","split","map","part","trim","getMutableClientRect","clientRect","getBoundingClientRect","right","bottom","width","height","isInsideClientRect","x","y","adjustClientRect","isPointerNearClientRect","rect","threshold","pointerX","pointerY","xThreshold","yThreshold","ParentPositionTracker","_document","_viewportRuler","positions","Map","clear","elements","set","scrollPosition","getViewportScrollPosition","forEach","scrollTop","scrollLeft","event","target","cachedPosition","get","scrolledParentNode","documentElement","newTop","newLeft","viewportScrollPosition","topDifference","leftDifference","node","contains","deepCloneNode","clone","cloneNode","descendantsWithId","querySelectorAll","nodeName","removeAttribute","i","length","transferCanvasData","transferInputData","transferData","selector","callback","descendantElements","cloneElements","cloneUniqueId","type","context","getContext","drawImage","_a","passiveEventListenerOptions","passive","activeEventListenerOptions","DragRef","_config","_ngZone","_dragDropRegistry","_passiveTransform","_activeTransform","_moveEvents","Subject","_pointerMoveSubscription","Subscription","_pointerUpSubscription","_scrollSubscription","_resizeSubscription","_boundaryElement","_nativeInteractionsEnabled","_handles","_disabledHandles","Set","_direction","dragStartDelay","_disabled","beforeStarted","started","released","ended","entered","exited","dropped","moved","_pointerDown","targetHandle","find","handle","has","disabled","_initializeDragSequence","_rootElement","_pointerMove","pointerPosition","_getPointerPositionOnPage","_hasStartedDragging","Math","abs","_pickupPositionOnPage","dragStartThreshold","isDelayElapsed","Date","now","_dragStartTime","_getDragStartDelay","container","_dropContainer","_endDragSequence","isDragging","isReceiving","preventDefault","run","_startDragSequence","_previewRect","_preview","constrainedPointerPosition","_getConstrainedPointerPosition","_hasMoved","_lastKnownPointerPosition","_updatePointerDirectionDelta","_updateActiveDropContainer","activeTransform","_applyRootElementTransform","SVGElement","setAttribute","observers","distance","_getDragDistance","delta","_pointerDirectionDelta","_pointerUp","withRootElement","withParent","parentDragRef","_parentPositions","registerDragItem","newValue","_toggleNativeDragInteractions","_placeholder","getPlaceholderElement","getRootElement","handles","disabledHandles","add","template","_previewTemplate","_placeholderTemplate","rootElement","_removeRootElementListeners","runOutsideAngular","addEventListener","_initialTransform","undefined","_ownerSVGElement","ownerSVGElement","boundaryElement","unsubscribe","change","subscribe","_containInsideBoundaryOnResize","parent","_parentDragRef","removeNode","_anchor","_destroyPreview","_destroyPlaceholder","removeDragItem","_removeSubscriptions","complete","transform","delete","direction","_previewRef","destroy","_placeholderRef","stopDragging","_rootElementTapHighlight","_stopScrolling","_animatePreviewToPlaceholder","then","_cleanupDragArtifacts","_cleanupCachedDimensions","isTouchEvent","_lastTouchEventTime","dropContainer","parentNode","preview","_createPreviewElement","placeholder","_createPlaceholderElement","anchor","createComment","shadowRoot","_getShadowRoot","insertBefore","body","appendChild","replaceChild","documentRef","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","start","_initialContainer","_initialIndex","getItemIndex","cache","getScrollableParents","referenceElement","stopPropagation","isTouchSequence","isAuxiliaryMouseButton","button","isSyntheticEvent","draggable","pointerMove","pointerUp","scroll","scrollEvent","_updateOnScroll","_boundaryRect","previewTemplate","_pickupPositionInElement","matchSize","_getPointerPositionInElement","_pointerPositionAtLastDirectionChange","startDragging","currentIndex","isPointerOverContainer","_isOverContainer","item","previousIndex","previousContainer","drop","rawX","rawY","newContainer","_getSiblingContainerFromPosition","exit","enter","sortingDisabled","_startScrollingIfNecessary","_sortItem","getTransform","previewConfig","previewClass","rootRect","viewRef","viewContainer","createEmbeddedView","detectChanges","getRootNode","matchElementSize","pointerEvents","margin","zIndex","classList","Array","isArray","className","Promise","resolve","placeholderRect","duration","getComputedStyle","transitionedProperties","property","prop","propertyIndex","rawDurations","rawDelays","handler","propertyName","removeEventListener","clearTimeout","timeout","setTimeout","placeholderConfig","placeholderTemplate","elementRect","handleElement","referenceRect","point","targetTouches","_getViewportScrollPosition","pageX","pageY","touches","changedTouches","svgMatrix","getScreenCTM","svgPoint","createSVGPoint","matrixTransform","inverse","dropContainerLock","lockAxis","constrainPosition","pickupX","pickupY","boundaryRect","previewRect","minY","maxY","clamp","pointerPositionOnPage","positionSinceLastChange","changeX","changeY","pointerDirectionChangeThreshold","shouldEnable","currentPosition","pickupPosition","leftOverflow","rightOverflow","topOverflow","bottomOverflow","setFreeDragPosition","touch","mouse","scrollDifference","handleScroll","_cachedShadowRoot","round","min","max","removeChild","rootNodes","nodeType","ELEMENT_NODE","wrapper","createElement","sourceRect","moveItemInArray","array","fromIndex","toIndex","from","clamp$1","to","DropListRef","autoScrollDisabled","autoScrollStep","enterPredicate","sortPredicate","sorted","_isDragging","_itemPositions","_previousSwap","drag","overlaps","_draggables","_siblings","_orientation","_activeSiblings","_viewportScrollSubscription","_verticalScrollDirection","_horizontalScrollDirection","_stopScrollTimers","_startScrollInterval","scheduler","isNumeric","Observable","animationFrame","pipe","takeUntil","_scrollNode","scrollStep","incrementVerticalScroll","incrementHorizontalScroll","withScrollableParents","registerDropContainer","removeDropContainer","_draggingStarted","_notifyReceivingSiblings","index","newIndex","_getItemIndexFromPointerPosition","activeDraggables","_activeDraggables","newPositionReference","splice","parentElement","_shouldEnterAsFirstChild","reference","unshift","push","_cacheItemPositions","_cacheParentPositions","_reset","items","previousItems","_withDropContainer","filter","every","_cacheItems","connectedTo","slice","orientation","_scrollableElements","findIndex","reverse","currentItem","size","pointerDelta","_clientRect","siblings","isHorizontal","siblingAtNewPosition","newPosition","itemOffset","_getItemOffsetPx","siblingOffset","_getSiblingOffsetPx","oldOrder","sibling","isDraggedItem","offset","elementToOffset","scrollNode","verticalScrollDirection","horizontalScrollDirection","computedVertical","getVerticalScrollDirection","computedHorizontal","getHorizontalScrollDirection","scrollHeight","clientHeight","scrollWidth","clientWidth","getViewportSize","window","_initialScrollSnap","msScrollSnapType","scrollSnapType","_listenToScrollEvents","elementToMeasure","getVisibleElement","sort","a","b","_stopReceiving","immediateSibling","end","itemPositions","lastItemRect","firstItemRect","_","floor","_canReceive","elementFromPoint","nativeElement","activeSiblings","_sortFromLastPointerPosition","draggedItems","_startReceiving","predicate","amount","scrollBy","activeCapturingEventOptions","capture","DragDropRegistry","_dropInstances","_dragInstances","_activeDragInstances","_globalListeners","_draggingPredicate","_preventDefaultWhileDragging","_persistentTouchmoveListener","some","startsWith","e","options","config","_clearGlobalListeners","instance","ɵfac","t","ɵprov","factory","token","providedIn","DEFAULT_CONFIG","DragDrop","CDK_DRAG_PARENT","CDK_DROP_LIST_GROUP","CDK_DRAG_CONFIG","_uniqueIdCounter","CDK_DROP_LIST","CdkDropList","dragDrop","_changeDetectorRef","_scrollDispatcher","_dir","_group","_destroyed","id","_unsortedItems","_dropListRef","createDropList","data","_assignDefaults","_setupInputSyncSubscription","_handleEvents","_dropLists","_items","_syncItemsWithRef","_dragRef","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","dispose","ref","startWith","withDirection","list","_scrollableParentsResolved","scrollableParents","getAncestorScrollContainers","scrollable","getElementRef","withOrientation","markForCheck","emit","draggingDisabled","listAutoScrollDisabled","listOrientation","withItems","getSortedItems","ɵdir","selectors","hostAttrs","hostVars","hostBindings","rf","ctx","inputs","outputs","exportAs","features","provide","useValue","useExisting","CDK_DRAG_HANDLE","CdkDragHandle","parentDrag","_stateChanges","_parentDrag","CDK_DRAG_PLACEHOLDER","CDK_DRAG_PREVIEW","CdkDrag","_viewContainerRef","_selfHandle","observer","subscription","movedEvent","createDrag","addItem","_syncInputs","reset","getFreeDragPosition","onStable","take","_updateRootElement","changes","tap","childHandleElements","rootElementSelector","withHandles","switchMap","merge","handleInstance","dragRef","disableHandle","enableHandle","freeDragPosition","rootSelectorChange","positionChange","firstChange","removeItem","getClosestMatchingAncestor","boundary","dir","templateRef","withBoundaryElement","_getBoundaryElement","withPlaceholderTemplate","withPreviewTemplate","_b","contentQueries","dirIndex","_t","first","currentElement","matches","msMatchesSelector","DragDropModule","ɵmod","ɵinj","providers","imports","_c0","MatAutocomplete_ng_template_0_Template","formFieldId_r1","ctx_r0","_classList","ariaLabel","_getPanelAriaLabelledby","_c1","_uniqueAutocompleteIdCounter","MatAutocompleteSelectedEvent","option","MatAutocompleteBase","_MatAutocompleteMixinBase","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS","autoActiveFirstOption","_MatAutocompleteBase","_elementRef","defaults","platform","super","_activeOptionChanges","showPanel","_isOpen","displayWith","optionSelected","opened","closed","optionActivated","inertGroups","SAFARI","_autoActiveFirstOption","reduce","_setVisibilityClasses","_keyManager","withWrap","toArray","_setVisibility","panel","labelId","ariaLabelledby","_visibleClass","_hiddenClass","viewQuery","panelWidth","MatAutocomplete","arguments","ɵMatAutocomplete_BaseFactory","ɵcmp","optionGroups","disableRipple","ngContentSelectors","decls","vars","consts","directives","encapsulation","changeDetection","MAT_AUTOCOMPLETE_SCROLL_STRATEGY","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER","deps","useFactory","overlay","scrollStrategies","reposition","MAT_AUTOCOMPLETE_VALUE_ACCESSOR","MatAutocompleteTrigger","multi","_MatAutocompleteTriggerBase","_element","_overlay","_zone","scrollStrategy","_formField","_defaults","_componentDestroyed","_autocompleteDisabled","_manuallyFloatingLabel","_viewportSubscription","_canOpenOnNextFocus","_closeKeyEventStream","_windowBlurHandler","activeElement","panelOpen","_onChange","_onTouched","autocompleteAttribute","_overlayAttached","optionSelections","autocomplete","onSelectionChange","_scrollStrategy","_getWindow","_positionStrategy","_setStrategyPositions","_overlayRef","updatePosition","_destroyPanel","_attachOverlay","_floatLabel","_resetLabel","hasAttached","detach","_closingActionsSubscription","tabOut","_getOutsideClickStream","detachments","of","activeItem","clickTarget","_isInsideShadowRoot","composedPath","formField","customOrigin","elementRef","overlayElement","_setTriggerValue","fn","isDisabled","keyCode","activeOption","_selectViaInteraction","_resetActiveItem","prevActiveItem","isArrowKey","onKeydown","_canOpen","openPanel","_scrollToOption","activeItemIndex","_previousValue","shouldAnimate","floatLabel","_animateAndLockLabel","firstStable","optionChanges","reapplyLastPosition","wasOpen","panelClosingActions","_setValueAndClose","closePanel","toDisplay","inputValue","_control","_clearPreviousSelectedOption","focus","_emitSelectEvent","skip","selected","deselect","overlayRef","setOrigin","_getConnectedElement","updateSize","_getPanelWidth","_portal","getLabelId","create","_getOverlayConfig","keydownEvents","attach","_subscribeToClosingActions","positionStrategy","_getOverlayPosition","panelClass","overlayPanelClass","strategy","flexibleConnectedTo","withFlexibleDimensions","withPush","belowPositions","originX","originY","overlayX","overlayY","_aboveClass","abovePositions","withPositions","getConnectedOverlayOrigin","_getHostWidth","setFirstItemActive","setActiveItem","readOnly","defaultView","labelCount","_setScrollTop","_getHostElement","newScrollPosition","offsetTop","offsetHeight","_getScrollTop","autocompleteDisabled","ɵMatAutocompleteTrigger_BaseFactory","_handleFocus","$event","_handleInput","_handleKeydown","toString","MatAutocompleteModule","MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS","MAT_BUTTON_TOGGLE_GROUP","MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR","MatButtonToggleGroup","uniqueIdCounter","MatButtonToggleChange","_changeDetector","defaultOptions","_vertical","_multiple","_controlValueAccessorChangeFn","_name","valueChange","appearance","_buttonToggles","toggle","_markForCheck","_selectionModel","multiple","_setSelectionByValue","select","checked","isUserInput","deferEvents","_updateModelValue","isSelected","_rawValue","_clearSelection","currentValue","_selectValue","correspondingOption","_emitChangeEvent","MatButtonToggle","vertical","MatButtonToggleBase","_MatButtonToggleMixinBase","toggleGroup","_focusMonitor","defaultTabIndex","_isSingleSelector","_checked","parsedTabIndex","Number","tabIndex","buttonToggleGroup","_appearance","_isSelected","_syncButtonToggle","group","_isPrechecked","monitor","stopMonitoring","_buttonElement","newChecked","_onButtonClick","_r0","buttonId","MatButtonToggleModule","MAT_CHIP_REMOVE","MAT_CHIP_AVATAR","MAT_CHIP_TRAILING_ICON","MatChipBase","_MatChipMixinBase","MatChip","globalRippleOptions","animationMode","_hasFocus","chipListSelectable","_chipListMultiple","_chipListDisabled","_selected","_selectable","_removable","_onFocus","_onBlur","selectionChange","destroyed","removed","_addHostClassName","_chipRippleTarget","_chipRipple","setupTriggerEvents","rippleConfig","_animationsDisabled","parseInt","coercedValue","_dispatchSelectionChange","_value","textContent","selectable","hasAttribute","tagName","chip","_removeTriggerEvents","removable","remove","toggleSelected","avatar","trailingIcon","removeIcon","_handleClick","_blur","ariaSelected","color","MatChipRemove","_parentChip","parentChip","MAT_CHIPS_DEFAULT_OPTIONS","MatChipListBase","_defaultErrorStateMatcher","_parentForm","_parentFormGroup","ngControl","_MatChipListMixinBase","nextUniqueId","MatChipListChange","MatChipList","controlType","_lastDestroyedChipIndex","_uid","_tabIndex","_userTabIndex","_compareWith","o1","o2","_required","ariaOrientation","valueAccessor","empty","_syncChipsState","_initializeSelection","writeValue","_chipInput","stateChanges","focused","_hasFocusedChip","chips","withVerticalOrientation","withHomeAndEnd","withHorizontalOrientation","_allowFocusEscape","_resetChips","_updateTabIndex","_updateFocusForDestroyedChips","updateErrorState","_dropSubscriptions","inputElement","ids","_ariaDescribedby","join","_originatesFromChip","_focusInput","_isInputEmpty","setLastItemActive","newChipIndex","_sortValues","correspondingChip","selectViaInteraction","fallbackValue","valueToEmit","_markAsTouched","_listenToChipsFocus","_listenToChipsSelection","_listenToChipsRemoved","_chipFocusSubscription","_chipBlurSubscription","_chipSelectionSubscription","_chipRemoveSubscription","chipSelectionChanges","_propagateChanges","chipFocusChanges","chipIndex","_isValidIndex","updateActiveItem","chipBlurChanges","chipRemoveChanges","_keydown","role","required","errorState","compareWith","errorStateMatcher","nextUniqueId$1","MatChipInput","_defaultOptions","_addOnBlur","separatorKeyCodes","chipEnd","_inputElement","_chipList","registerInput","_emitChipEnd","addOnBlur","_isSeparatorKey","input","_focus","_onInput","invalid","chipList","ɵ0","MatChipsModule","enterDuration","_c2","MAT_RADIO_DEFAULT_OPTIONS","MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR","MatRadioGroup","MatRadioChange","MAT_RADIO_GROUP","_MatRadioGroupBase","_isInitialized","_labelPosition","onTouched","_updateRadioButtonNames","v","_markRadiosForCheck","_updateSelectedRadioFromValue","_checkSelectedRadioButton","_radios","radio","labelPosition","ɵMatRadioGroup_BaseFactory","MatRadioButton","MatRadioButtonBase","_MatRadioButtonMixinBase","_MatRadioButtonBase","radioGroup","_radioDispatcher","_animationMode","_providerOverride","_uniqueId","_removeUniqueSelectionListener","listen","newCheckedState","notify","_setDisabled","_color","origin","focusVia","focusOrigin","_touch","groupValueChanged","String","ariaDescribedby","changeDetector","focusMonitor","radioDispatcher","providerOverride","_onInputChange","_onInputClick","inputId","_isRippleDisabled","MatRadioModule","_c3","_c4","MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS","disableToggleValue","MAT_SLIDE_TOGGLE_VALUE_ACCESSOR","MatSlideToggle","MatSlideToggleChange","MatSlideToggleBase","_MatSlideToggleMixinBase","toggleChange","_thumbEl","_thumbBarEl","_onChangeEvent","_onLabelTextChange","_r4","_MatSlideToggleRequiredValidatorModule","MatSlideToggleModule","root","a0","Chartist","document","currency","currencyFormatCallback","tooltipOffset","anchorToPoint","appendToBody","class","pointClass","hasClass","getAttribute","offsetParent","elem","plugins","tooltip","extend","chart","tooltipSelector","Bar","Pie","donut","donutSolid","$toolTip","$chart","$toolTipIsShown","$tooltipOffsetParent","querySelector","offsetWidth","on","setPosition","offsetX","offsetY","x2","y2","box","baseVal","pageYOffset","pageXOffset","offsetBox","allOffsetLeft","allOffsetTop","hide","regex","RegExp","replace","$point","tooltipText","seriesName","meta","hasMeta","transformTooltipTextFnc","tooltipFnc","metaIsHTML","txt","innerHTML","label","nextSibling","innerText","display","version","globalRoot","namespaces","svg","xmlns","xhtml","xlink","ct","noop","n","alphaNumerate","fromCharCode","sourceProp","replaceAll","str","subStr","newSubStr","ensureUnit","unit","quantity","match","exec","query","times","apply","sum","previous","current","mapMultiply","factor","num","mapAdd","addend","serialMap","arr","cb","result","args","roundWithPrecision","digits","precision","pow","escapingMap","'","serialize","JSON","stringify","Object","keys","deserialize","parse","createSvg","prototype","call","getAttributeNS","Svg","attr","addClass","_node","normalizeData","output","raw","normalized","series","getDataArray","labels","reverseData","safeHasProperty","object","isDataHoleValue","isNaN","recursiveConvert","multiValue","getNumberOrUndefined","normalizePadding","padding","fallback","getMetaData","orderOfMagnitude","log","LN10","projectLength","axisLength","bounds","range","getAvailableHeight","chartPadding","axisX","getHighLow","dimension","highLow","high","toUpperCase","MAX_VALUE","low","findHigh","findLow","recursiveHighLow","referenceValue","isFinite","isFalseyButZero","isMultiValue","getMultiValue","rho","gcd","p","q","f","divisor","x1","getBounds","scaleMinSpace","onlyInteger","newMin","newMax","optimizationCounter","valueRange","oom","step","ceil","numberOfSteps","scaleUp","smallestFactor","Error","safeIncrement","increment","values","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","PI","cos","sin","createChartRect","fallbackPadding","hasAxis","axisY","yAxisOffset","xAxisOffset","normalizedPadding","chartRect","y1","createGrid","axis","classes","eventEmitter","positionalData","units","pos","counterUnits","gridElement","createGridBackground","gridGroup","gridBackground","createLabel","axisOffset","labelOffset","useForeignObject","labelElement","len","content","foreignObject","text","getSeriesOption","seriesOptions","optionsProvider","responsiveOptions","currentOptions","baseOptions","mediaQueryListeners","updateCurrentOptions","mediaEvent","previousOptions","matchMedia","mql","addListener","removeMediaQueryListeners","removeListener","getCurrentOptions","splitIntoSegments","pathCoordinates","valueData","increasingX","fillHoles","segments","hole","global","Interpolation","none","path","Path","currX","currY","currData","move","line","simple","d","prevX","prevY","prevData","curve","cardinal","tension","c","paths","segment","iLen","monotoneCubic","xs","ys","ms","ds","dys","dxs","postpone","EventEmitter","handlers","addEventHandler","removeEventHandler","starHandler","listToArray","Class","properties","superProtoOverride","superProto","proto","cloneDefinitions","constr","constructor","getOwnPropertyNames","propName","defineProperty","getOwnPropertyDescriptor","initialize","resizeListener","update","bind","plugin","createChart","initializeTimeoutId","Base","supportsForeignObject","isSupported","supportsAnimations","__chartist__","override","off","attributes","insertFirst","Element","createElementNS","firstChild","ns","namespacedAttribute","setAttributeNS","foundNode","foundNodes","List","getNode","fnObj","createTextNode","newElement","append","names","concat","self","removeClass","removedClasses","removeAllClasses","animate","animations","guided","attribute","createAnimate","animationDefinition","easing","attributeProperties","Easing","begin","dur","calcMode","keySplines","keyTimes","fill","attributeName","beginElement","err","params","feature","implementation","hasFeature","easeInSine","easeOutSine","easeInOutSine","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","nodeList","svgElements","prototypeProperty","elementDescriptions","m","l","accuracy","command","pathElements","relative","pathElement","forEachParam","pathElementIndex","paramName","paramIndex","close","count","arc","rx","ry","xAr","lAf","sf","scale","translate","transformFnc","transformed","chunks","pop","chunk","shift","description","spliceArgs","accuracyMultiplier","splitByCommand","joinedPath","j","axisUnits","rectStart","rectEnd","rectOffset","Axis","ticks","gridOffset","createGridAndLabels","labelGroup","chartOptions","axisOptions","projectedValues","projectValue","labelValues","labelInterpolationFnc","projectedValue","labelLength","showGrid","classNames","grid","showLabel","AutoScaleAxis","axisUnit","FixedScaleAxis","stepLength","StepAxis","calc","stretch","showLine","showPoint","showArea","areaBase","lineSmooth","showGridBackground","fullWidth","area","horizontal","Line","seriesGroup","seriesIndex","seriesElement","pathData","valueIndex","seriesMeta","areaBaseProjected","pathSegment","solidPathSegments","firstElement","lastElement","areaPath","seriesBarDistance","stackBars","stackMode","horizontalBars","distributeSeries","bar","serialSums","prev","curr","valueAxis","labelAxisTicks","labelAxis","zeroPoint","stackedBarValues","periodHalfLength","biPol","projected","previousStack","labelAxisValueIndex","metaData","chartPie","chartDonut","slicePie","sliceDonut","sliceDonutSolid","startAngle","total","donutWidth","labelDirection","ignoreEmptyValues","determineAnchorPosition","center","toTheRight","labelsGroup","labelRadius","totalDataSum","seriesGroups","previousValue","hasSingleValInSeries","val","endAngle","overlappigStartAngle","innerStart","innerEnd","donutSolidRadius","pathClassName","strokeWidth","rawValue","interpolatedValue","dx","dy","module","exports","equal","flags","valueOf","BiolinkWidgetsService","http","biolinkId","post","widgetId","put","widgetIds","BASE_URI","BiolinkEditorTabs","links","settings","BiolinkEditorService","biolinks","toast","fb","widgets","modal","biolink$","BehaviorSubject","loading$","activeTab$","appearanceForm","fontConfig","btnConfig","control","variant","bgConfig","saveAppearance","finalize","open","with","response","biolink","patchValue","reloadBiolink","link","groups","featuresToHide","alias","domain","linkGroups","tags","afterClosed","newLink","title","model_type","ok","confirmed","updateContentItemConfig","ImageWidgetModalComponent","dialogRef","editor","form","url","destinationUrl","crupdateWidget","widget","createOrUpdate","YoutubeWidgetModalComponent","errors$","SoundcloudWidgetModalComponent","encodedUrl","encodeURIComponent","embedCode","html","r","VimeoWidgetModalComponent","widgetType","SpotifyWidgetModalComponent","TwitchWidgetModalComponent","includes","TiktokWidgetModalComponent","SOCIALS_WIDGET_SERVICES","inputType","pattern","WIDGET_LIST","image","component","TextWidgetModalComponent","SocialsWidgetModalComponent","services","service","addControl","WidgetListModalComponent","BiolinkSlideoutPanelComponent","visible$","ANIMATION_LIST","AnimationSelectorComponent","lazyLoader","animationList","selectedAnimation$","loadAsset","propagateChange","animation","selectAnimation","LeapLinkPanelComponent","leapUntilControl","leapIsActive$","sub","valueChanges","distinctUntilChanged","setValue","date","setDate","getDate","toISOString","LinkThumbnailPanelComponent","uploadQueue","imageValidator","src$","types","files","httpParams","diskPrefix","uri","validator","fileEntry","activeSlideOutPanel$","BiolinkEditorLinkComponent","section","active","leap_until","expires_at","activates_at","formSub","animSub","active_locked","disable","debounceTime","getDirtyFromValues","leapActive$","activeObservable","animationActive$","imageActive$","scheduleActive$","combineLatest","openCrupdateLinkDialog","admin","leap_link","fieldName","dirtyValues","entries","controls","dirty","openEditLinkDialog","toggleAnimationPanel","BiolinkEditorWidgetComponent","w","listItem","getWidgetConfig","BiolinkEditorContentComponent","skeletonIterator","trackByFn","createMsg","newContent","payload","changeOrder","openNewLinkDialog","openWidgetListDialog","uploadedImgBg","configId","configLabel","backgroundSize","repeat","flatColorBg","backgroundColor","BACKGROUND_LIST","backgroundImage","backgroundAttachment","backgroundRepeat","GRADIENT_LIST","BackgroundSelectorGradientComponent","overlayPanelRef","gradients","gradient","BackgroundSelectorImgComponent","imgValidator","el","bgUrl","imgUploaded","selectedBg","disk","LabelFromFilenamePipe","BackgroundSelectorComponent","backgrounds","selectedBg$","bg","setFlatColorBg","openColorPicker","selectBackground","oldColor","newBg","BeColorPickerModule","components","valueChanged","BROWSER_SAFE_FONTS","family","category","FontDisplayNamePipe","fontFamily","GoogleFontSelectorComponent","googleFonts","activePage$","chunkedFonts$","selectedFamily$","filters","from$","perPage","total$","to$","fonts$","page","chunkedFonts","allFonts","getAll","fonts","chunkFonts","fontSub","loadIntoDom","chunkSize","chunked","prevPage","nextPage","BiolinkEditorFontsComponent","BiolinkEditorButtonsComponent","colorControl","active$","markAsDirty","BiolinkAppearanceComponent","BiolinkSettingsComponent","linkForm","valueLists","currentUser","hiddenFeatures","details","slugBaseUri$","options$","userId","formGroup","o","domainId","setSlugBaseUri","errors","domains","host","getBaseUrl","saveSettings","BiolinkEditorComponent","route","router","appearance$","linkId","queryParams","tab","navigate","replaceUrl","tabChanged","BiolinkIndexComponent","datatable","linkUsage","activeSection","workspaces","biolinks$","data$","L","workspaceSub","activeId$","setFilters","init","staticParams","withCount","showUserColumn","biolinkIds","confirmResourceDeletion","selectedRows$","errResponse","message","openCreateBiolinkModal","BiolinksService","groupId","contentItem","order","analyticsEndpoint","item_id","item_model_type","BetweenInputComponent","setDefaultDate","showLabels","datePattern","initiated","defaultFrom","getDefaultDate","defaultTo","minusDays","month","addZero","getMonth","day","getFullYear","number","customRange$","ClickChartsComponent","loader","theme","i18n","endpoint","transformedReports$","customRangeControl","reports","updateCharts","initGoogleWorldMap","customRange","getUpdateDataRequest","analytics","drawGoogleChart","selectedTheme$","googleChart","mainData","browsers","transformData","platforms","devices","clicks","translateLabel","legend","google","charts","load","packages","mapsApiKey","setOnLoadCallback","locations","location","visualization","arrayToDataTable","colorAxis","colors","is_dark","datalessRegionColor","GeoChart","iframe","draw","ClickChartsModule","WorkspaceSelectorComponent","vcr","cd","indexUserWorkspaces","workspace","WorkspaceModule","crupdateModal","viewContainerRef","manageMembers","menuTrigger","closeMenu","replacements","resource","LinkUsageInfoComponent","UpgradePanelComponent","compact","reload","closePopover","infoIcon","hasBackdrop","openPopover","DashboardHostComponent","notifications","subscriptions","bindToNotificationClick","bindToWorkspaceChange","s","activePage","sidenav","onPageChange","LinkReportsResolverService","getCurrentUserReports","catchError","E","mergeMap","DashboardHomeComponent","reports$","LinkDomainComponent","customDomains","showCrupdateDomainModal","LinkPageIndexComponent","customPages","RedirectToOnboardingGuard","localStorage","isLoggedIn","isSubscribed","WORKSPACE_CONFIG","WorkspaceIndexComponent","workspaceConfig","workspaces$","openCrupdateResourceModal","deleteMember","routes","canActivate","children","api","canDeactivate","hideSlug","DashboardRoutingModule","CustomDomainModule","LinkTypeMenuComponent","selectValue","DatetimeInputModule","EnterKeybindDirective","enterPressed","fromEvent","blur","WorkspaceSelectorModule","GoogleFontSelectorModule","BackgroundSelectorModule","LinkOptionsFormModule","BiolinkEditorModule","DashboardModule","S","CrupdateLinkGroupModalComponent","updating$","hash","rotator","domain_id","domains$","linkGroup","resourceName","LinkGroupAnalyticsPageComponent","analytics$","linkGroup$","linkeableId","LINK_GROUP_INDEX_FILTERS","defaultValue","LinkGroupIndexComponent","groups$","groupIds","showCrupdateGroupModal","LinkGroupLinksIndexComponent","groupId$","filterByUser","GenericPagePreviewComponent","CrupdateLinkOverlayPageComponent","linkOverlays","label_position","btn_link","btn_text","linkOverlay","snapshot","getDefaultValue","request","msg","markAsPristine","relativeTo","overlayCmp","colorControls","confirm","LINK_OVERLAY_FILTERS","LinkOverlayIndexComponent","overlays$","overlayIds","LinkOverlayService","Event","bubbles","createEvent","initEvent","resize","overflowY","overflowX","wordWrap","boxSizing","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","u","dispatchEvent","LinkCreatedMessageComponent","CrupdateLinkModalComponent","selectValues","recaptcha","optionsVisible$","linkOptions$","minLen","maxLen","textarea","getPayload","urlInvalid","long_url","setErrors","verify","openComponent","long_urls","createBatch","exact","strict","test","shortenBatchUrls","visibility","CrupdateLinkSelectValuesService","getWithCache","pageType","clearCache","LINK_INDEX_FILTERS","operator","defaultOperator","operators","AttachLinkModalComponent","links$","searchControl","findLinks","forCurrentUser","per_page","pagination","RemoveProtocolPipe","LinkIndexComponent","csv","group$","paginator","response$","linkIds","beforeClosed","batch","export","showCrupdateLinkModal","exportCsv","DomainFormControlComponent","groupDirective","hideLabel","defaultHost$","setDefaultHost","formControl","controlName","defaultHost","baseUrl","UtmBuilderDialogComponent","utm_source","utm_medium","utm_campaign","utm_term","utm_content","hydrateForm","formToUrlParams","utmQuery","URLSearchParams","formValue","save","LinkOptionsFormComponent","linkOptions","utmValue","utm","LinkShowResolverService","LinkShowComponent","PermissionAwareInputContainerComponent","usage","lockIconHidden$","usageSub","permission","isAdmin","controlGroup","lockIcon","createHoverListener","listeningToHover","showMessage","toElement","relatedTarget","hideMessage","createMsgType","getPanelEl","SimplePermissionOverlayComponent","forWorkspace","action","failReason","PermissionAwareButtonComponent","matButton","matMenuItem","regularButton","hydrateConfig","hasPermission","userOwnsResource","toggleButtonState","setOverlayCmp","restriction","userOwnsWorkspace","shouldShowUpgradeOverlay","UpgradeOverlayComponent","siteName","TrackingPixelService","TrackingPixelTypes","CrupdateTrackingPixelModalComponent","pixels","selectedType$","head_code","body_code","pixel_id","typeName","pixel","TRACKING_PIXEL_FILTERS","TrackingPixelIndexComponent","trackingPixels","pixels$","pixelIds","showCrupdatePixelModal","LinkUsageService","LinkForm","build","linkHash","rules","geo_rules","device_rules","platform_rules","rule","type_id","password","defaultType","exp_clicks_rule","geoRules","deviceRules","platformRules","expClicksRule","addNewGeoRule","addNewDeviceRule","addNewPlatformRule","has_password","messages","AppearanceImageUploadValidator","DEFAULT_MAX_SIZE_MB","validations","maxSize","FindUserModalComponent","users","searchFormControl","users$","searchUsers","user","normalizeUser","display_name","BetweenDateInputModule","ChipInputComponent","emailsInput","selectMode","items$","suggestedValues$","suggestFn","bindToSearchControl","parseEmailsOnPaste","propagate","matAutocomplete","isOpen","duplicate","findValueIndex","inputEl","filtered","emails","clipboardData","getData","selection","getSelection","rangeCount","deleteFromDocument","email","addFromAutocomplete","ChipsModule","ColorPickerInputComponent","overlayPanel","color$","pickerSub","ColorPickerInputModule","DatetimeInputComponent","currentDateAsDefault","time","setCurrentDatetime","substr","currentDate","currentTime","datetime","hours","minutes","InfoPopoverComponent","infoButton","wider","togglePopover","onMouseLeave","InfoPopoverModule","RIGHT_POSITION","SelectUserInputModule","SKELETON_ANIMATIONS","removeNullFromObject","obj","copy","CsvExportInfoDialogComponent","CsvExporterService","downloadPath","href","click","CsvExportInfoDialogModule","CUSTOM_DOMAIN_FILTERS","Steps","CrupdateCustomDomainModalComponent","currentStep$","disabled$","validationFailReason$","isSubdomain$","currentUserIsAdmin","validate","nextStep","authorizeCrupdate","serverIp","Host","skipAuthorize","Validate","connectDomain","validateDnsForDomain","Finalize","CustomDomainIndexComponent","domainIds","CustomDomainService","UserColumnComponent","showEmail","haveUrl","filterSelected","FilterSuggestionsComponent","originalOrder","anyFocused","k","dataset","filterKey","SelectModelControlComponent","dialog","value$","openSelectModelDialog","componentData","model","FILTER_OPERATOR_NAMES","doesntHave","OperatorDisplayNamePipe","breakpoints","isMobile$","OperatorSelectComponent","resizeSelect","selectedIndex","ActiveFilterComponent","compareFilterValueFn","val1","val2","resizeInput","valueInput","ActiveFiltersComponent","opts","emitEvent","last","focusValueInput","removeControl","activeEl","removeByKey","controlKey","getFocusedIndex","Keycodes","Keybinds","bindings","keybinds","keybind","parseKeybindString","keybindString","fireIfInputFocused","executeBindings","binding","bindingMatches","ctrlKey","ctrl","metaKey","shiftKey","parts","parsed","SearchInputWithFiltersComponent","filterChange","inputFocus","filterBarHeight","filterDropdownVisible$","keyedFilters","haveFiltersOrQuery$","watchForSizeChanges","setFiltersFromQuery","setupKeybinds","subscribeToCloseActions","bindToFormValueChange","activeFilters","searchInput","closeActionsStream$","searchInputIsFocused","selectionStart","formData","encodeFilterFormData","ResizeObserver","contentRect","observe","qp","routerState","decodeFilterString","filterValue","cursorAtStartOfSearchInput","focusLast","removeCurrentlyFocused","focusPrevious","getByIndex","lastIsFocused","cursorAtEndOfSearchInput","suggestions","toggleFilterDropdown","focusItemAt","getFocusedFilter","listenOn","addFilterFromDropdownClick","btoa","filterString","filtersFromQuery","atob","decodeURIComponent","DatatableFiltersComponent","datable","filters$","onFilterChange","DatatableFilter","FilterOperator","eq","FilterControlType","Select","ALL_PRIMITIVE_OPERATORS","ne","gt","gte","lt","lte","TimestampFilter","CreatedAtFilter","UpdatedAtFilter","DatatableFooterComponent","hidePerPage","perPageControl","changeRef","totalRecords","current_page","havePrevious","canLoadPrevPage","haveNext","canLoadNextPage","changePerPage","previousPage","SearchInputWithFiltersModule","DatatableModule","Paginator","params$","paginatedOnce$","dontUpdateQueryParams","perPageCacheKey","noResults$","userParams","initialData","currentQueryParams","paginate","cursor","next_cursor","prev_cursor","newPerPage","firstPagination","updateQueryParams","currentPage","last_page","sortingDataAccessor","sortHeaderId","numberValue","DatatableService","sort$","searchTerm$","staticParams$","ignoreNextParamChange","originalData$","tableData","connectToPaginator","initialSearchTerm","orderBy","orderDir","searchControlSub","mainSub","assign","applyLocalTransforms","paginatorSub","pairwise","infiniteScroll","valueA","valueB","valueAType","valueBType","comparatorResult","cmp","modifiedResource","DELETE_RESOURCE_MESSAGE","TableBodyCheckboxComponent","isRowSelected","toggleRow","TableHeaderCheckboxComponent","allRowsSelected","toggleAllRows","TableSortHeaderComponent","arrowVisible","arrowDirection","disableSort","columnName","sortSub","getDirection","changeSort","filterDatatableData","dataStr","objectToStr","transformedFilter","currentTerm","PendingChangesGuard","show","TinymceTextEditor","zone","makeBootstrapPromise","editorIsReady","tinymceInstance","setContent","undoManager","waitForEditor","hasUndo","hasRedo","queryCommandState","execCommand","getContent","contents","transact","setCursorLocation","nodeChanged","collapse","insertContents","bootstrapPromise","loadTinymce","initTinymce","textAreaEl","branding","browser_spellcheck","max_height","maxHeight","min_height","minHeight","autoresize_on_init","paste_as_text","elementpath","statusbar","entity_encoding","menubar","toolbar","convert_urls","forced_root_block","document_base_url","baseURI","element_format","body_class","content_style","content_css","default_link_target","link_assume_external_targets","target_list","link_title","image_dimensions","image_description","setup","onChange","init_instance_callback","bootstrapPromiseResolve","onEnter","onCtrlEnter","shortcuts","navigator","extended_valid_elements","getAssetUrl","codesample_languages","editorEl","tinymce","TextEditorImageValidator","convertToBytes","TextEditorComponent","renderer","sourceAreaControl","activeEditor","showAdvancedControls","basic","onFileUpload","bootTextEditor","destroyEditor","contentAreaContainer","setStyle","sourceTextArea","getContents","source_view","fileList","inlineUploadPrefix","insertImage","setContents","attrs","setConfig","visualTextArea","CrupdateCustomPageComponent","pages","slug","hide_nav","getPage","backRoute","delay","textEditor","CUSTOM_PAGE_FILTERS","CustomPageIndexModule","CustomPagesIndexComponent","pages$","pageIds","ChartType","BaseChart","generate","getMaxValue","ChartistLine","lineConfig","getHigh","transformChartData","generateDataWithTooltip","ChartistPie","pieConfig","pathLength","getTotalLength","ChartistBar","barConfig","ChartComponent","calcAndSetChartHeight","chartConfig","transformConfig","chartPlaceholder","innerHeight","headerWrapper","legendWrapper","ChartsModule","SlugControlComponent","slug$","editing$","slugControl","defaultBaseUri","fullBaseUri","endsWith","prefix","SlugControlModule","defaultThrottleConfig","leading","trailing","ThrottleTimeOperator","ThrottleTimeSubscriber","Subscriber","destination","_hasTrailingValue","_trailingValue","throttled","dispatchNext","arg","clearThrottle","UploadProgressBarComponent","hidden","totalProgress","lift","progress","count$","pending","UploadButtonDirective","filesSelected","UploadImageControlComponent","uploadsApi","fileDeleted","buttonText","uploadConfig","uploadInputConfig","isDisabled$","defaultUploadConfig","deleteForever","toggleMenu","uploadImage","UploadsModule","UploadImageControlModule","SidenavComponent","navIsOpen$","isCompact$","onDestroy$","isCompact","setProperty","removeProperty","events","storageSelector","SidenavModule","TextEditorModule","UploadUri","UploadQueueItem","file","queueId","canceled$","processing$","uploadedResponse$","ReplaySubject","progress$","percentage","error$","customData","uploadedFile","completed","setProgress","eta","AllowedExtensionsValidation","errorMessage","extensions","extension","BlockedExtensionsValidation","DefaultUploadValidator","DEFAULT_MAX_FILE_SIZE_MB","showToast","getMaxFileSize","allowedExtensions","getAllowedExtensions","blockedExtensions","getBlockedExtensions","getJson","UploadQueueService","defaultValidator","uploads$","totalProgress$","uploadsAdded$","queueItem","upload","asObservable","uploadQueueItems","transformUploads","updateCount","uploadQueueItem","handleUploadFailure","bubbleError","throwError","handleUploadEvent","willProcessFiles","queueItemId","speed","totalBytes","completedBytes","updateTotalProgress","addError","cancel","activeUpload","failed","updateProgress","completeUpload","showLearnMoreButton","errorUpload","onAction","inProgress","CrupdateWorkspaceModalComponent","LEAVE_WORKSPACE_CONFIRMATION","bodyBold","WorkspaceMessages","ManageWorkspaceMembersModalComponent","inviting$","deleting$","loadingMembers$","workspaceRoles$","members$","peopleToInvite","canInvite","canEdit","canDelete","workspaceRoles","invites","members","setCurrentUserPermissions","roleId","default","invitePeople","INVITES_SENT","invite","resendInvite","INVITE_RESENT","member","changeRole","ROLE_ASSIGNED","role_name","role_id","deleteInvite","LEFT_WORKSPACE","MEMBER_DELETED","is_owner","permissions"],"mappings":"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","sourceRoot":"webpack:///","sourcesContent":["import { Observable } from '../Observable';\nimport { async } from '../scheduler/async';\nimport { isNumeric } from '../util/isNumeric';\nexport function interval(period = 0, scheduler = async) {\n    if (!isNumeric(period) || period < 0) {\n        period = 0;\n    }\n    if (!scheduler || typeof scheduler.schedule !== 'function') {\n        scheduler = async;\n    }\n    return new Observable(subscriber => {\n        subscriber.add(scheduler.schedule(dispatch, period, { subscriber, counter: 0, period }));\n        return subscriber;\n    });\n}\nfunction dispatch(state) {\n    const { subscriber, counter, period } = state;\n    subscriber.next(counter);\n    this.schedule({ subscriber, counter: counter + 1, period }, period);\n}\n//# sourceMappingURL=interval.js.map","import { ɵɵdefineInjectable, ɵɵinject, NgZone, Injectable, Inject, InjectionToken, Directive, Input, EventEmitter, ElementRef, ChangeDetectorRef, Optional, SkipSelf, Output, TemplateRef, ViewContainerRef, Self, ContentChildren, ContentChild, NgModule } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { ViewportRuler, ScrollDispatcher, CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { normalizePassiveListenerOptions, _getShadowRoot } from '@angular/cdk/platform';\nimport { coerceBooleanProperty, coerceElement, coerceArray, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { Subject, Subscription, interval, animationFrameScheduler, Observable, merge } from 'rxjs';\nimport { takeUntil, startWith, map, take, tap, switchMap } from 'rxjs/operators';\nimport { Directionality } 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 * Shallow-extends a stylesheet object with another stylesheet object.\n * @docs-private\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/scrolling';\nimport * as ɵngcc2 from '@angular/cdk/bidi';\nfunction extendStyles(dest, source) {\n    for (let key in source) {\n        if (source.hasOwnProperty(key)) {\n            dest[key] = source[key];\n        }\n    }\n    return dest;\n}\n/**\n * Toggles whether the native drag interactions should be enabled for an element.\n * @param element Element on which to toggle the drag interactions.\n * @param enable Whether the drag interactions should be enabled.\n * @docs-private\n */\nfunction toggleNativeDragInteractions(element, enable) {\n    const userSelect = enable ? '' : 'none';\n    extendStyles(element.style, {\n        touchAction: enable ? '' : 'none',\n        webkitUserDrag: enable ? '' : 'none',\n        webkitTapHighlightColor: enable ? '' : 'transparent',\n        userSelect: userSelect,\n        msUserSelect: userSelect,\n        webkitUserSelect: userSelect,\n        MozUserSelect: userSelect\n    });\n}\n/**\n * Toggles whether an element is visible while preserving its dimensions.\n * @param element Element whose visibility to toggle\n * @param enable Whether the element should be visible.\n * @docs-private\n */\nfunction toggleVisibility(element, enable) {\n    const styles = element.style;\n    styles.position = enable ? '' : 'fixed';\n    styles.top = styles.opacity = enable ? '' : '0';\n    styles.left = enable ? '' : '-999em';\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/** Parses a CSS time value to milliseconds. */\nfunction parseCssTimeUnitsToMs(value) {\n    // Some browsers will return it in seconds, whereas others will return milliseconds.\n    const multiplier = value.toLowerCase().indexOf('ms') > -1 ? 1 : 1000;\n    return parseFloat(value) * multiplier;\n}\n/** Gets the transform transition duration, including the delay, of an element in milliseconds. */\nfunction getTransformTransitionDurationInMs(element) {\n    const computedStyle = getComputedStyle(element);\n    const transitionedProperties = parseCssPropertyValue(computedStyle, 'transition-property');\n    const property = transitionedProperties.find(prop => prop === 'transform' || prop === 'all');\n    // If there's no transition for `all` or `transform`, we shouldn't do anything.\n    if (!property) {\n        return 0;\n    }\n    // Get the index of the property that we're interested in and match\n    // it up to the same index in `transition-delay` and `transition-duration`.\n    const propertyIndex = transitionedProperties.indexOf(property);\n    const rawDurations = parseCssPropertyValue(computedStyle, 'transition-duration');\n    const rawDelays = parseCssPropertyValue(computedStyle, 'transition-delay');\n    return parseCssTimeUnitsToMs(rawDurations[propertyIndex]) +\n        parseCssTimeUnitsToMs(rawDelays[propertyIndex]);\n}\n/** Parses out multiple values from a computed style into an array. */\nfunction parseCssPropertyValue(computedStyle, name) {\n    const value = computedStyle.getPropertyValue(name);\n    return value.split(',').map(part => part.trim());\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/** Gets a mutable version of an element's bounding `ClientRect`. */\nfunction getMutableClientRect(element) {\n    const clientRect = element.getBoundingClientRect();\n    // We need to clone the `clientRect` here, because all the values on it are readonly\n    // and we need to be able to update them. Also we can't use a spread here, because\n    // the values on a `ClientRect` aren't own properties. See:\n    // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Notes\n    return {\n        top: clientRect.top,\n        right: clientRect.right,\n        bottom: clientRect.bottom,\n        left: clientRect.left,\n        width: clientRect.width,\n        height: clientRect.height\n    };\n}\n/**\n * Checks whether some coordinates are within a `ClientRect`.\n * @param clientRect ClientRect that is being checked.\n * @param x Coordinates along the X axis.\n * @param y Coordinates along the Y axis.\n */\nfunction isInsideClientRect(clientRect, x, y) {\n    const { top, bottom, left, right } = clientRect;\n    return y >= top && y <= bottom && x >= left && x <= right;\n}\n/**\n * Updates the top/left positions of a `ClientRect`, as well as their bottom/right counterparts.\n * @param clientRect `ClientRect` that should be updated.\n * @param top Amount to add to the `top` position.\n * @param left Amount to add to the `left` position.\n */\nfunction adjustClientRect(clientRect, top, left) {\n    clientRect.top += top;\n    clientRect.bottom = clientRect.top + clientRect.height;\n    clientRect.left += left;\n    clientRect.right = clientRect.left + clientRect.width;\n}\n/**\n * Checks whether the pointer coordinates are close to a ClientRect.\n * @param rect ClientRect to check against.\n * @param threshold Threshold around the ClientRect.\n * @param pointerX Coordinates along the X axis.\n * @param pointerY Coordinates along the Y axis.\n */\nfunction isPointerNearClientRect(rect, threshold, pointerX, pointerY) {\n    const { top, right, bottom, left, width, height } = rect;\n    const xThreshold = width * threshold;\n    const yThreshold = height * threshold;\n    return pointerY > top - yThreshold && pointerY < bottom + yThreshold &&\n        pointerX > left - xThreshold && pointerX < right + xThreshold;\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/** Keeps track of the scroll position and dimensions of the parents of an element. */\nclass ParentPositionTracker {\n    constructor(_document, _viewportRuler) {\n        this._document = _document;\n        this._viewportRuler = _viewportRuler;\n        /** Cached positions of the scrollable parent elements. */\n        this.positions = new Map();\n    }\n    /** Clears the cached positions. */\n    clear() {\n        this.positions.clear();\n    }\n    /** Caches the positions. Should be called at the beginning of a drag sequence. */\n    cache(elements) {\n        this.clear();\n        this.positions.set(this._document, {\n            scrollPosition: this._viewportRuler.getViewportScrollPosition(),\n        });\n        elements.forEach(element => {\n            this.positions.set(element, {\n                scrollPosition: { top: element.scrollTop, left: element.scrollLeft },\n                clientRect: getMutableClientRect(element)\n            });\n        });\n    }\n    /** Handles scrolling while a drag is taking place. */\n    handleScroll(event) {\n        const target = event.target;\n        const cachedPosition = this.positions.get(target);\n        if (!cachedPosition) {\n            return null;\n        }\n        // Used when figuring out whether an element is inside the scroll parent. If the scrolled\n        // parent is the `document`, we use the `documentElement`, because IE doesn't support\n        // `contains` on the `document`.\n        const scrolledParentNode = target === this._document ? target.documentElement : target;\n        const scrollPosition = cachedPosition.scrollPosition;\n        let newTop;\n        let newLeft;\n        if (target === this._document) {\n            const viewportScrollPosition = this._viewportRuler.getViewportScrollPosition();\n            newTop = viewportScrollPosition.top;\n            newLeft = viewportScrollPosition.left;\n        }\n        else {\n            newTop = target.scrollTop;\n            newLeft = target.scrollLeft;\n        }\n        const topDifference = scrollPosition.top - newTop;\n        const leftDifference = scrollPosition.left - newLeft;\n        // Go through and update the cached positions of the scroll\n        // parents that are inside the element that was scrolled.\n        this.positions.forEach((position, node) => {\n            if (position.clientRect && target !== node && scrolledParentNode.contains(node)) {\n                adjustClientRect(position.clientRect, topDifference, leftDifference);\n            }\n        });\n        scrollPosition.top = newTop;\n        scrollPosition.left = newLeft;\n        return { top: topDifference, left: leftDifference };\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/** Creates a deep clone of an element. */\nfunction deepCloneNode(node) {\n    const clone = node.cloneNode(true);\n    const descendantsWithId = clone.querySelectorAll('[id]');\n    const nodeName = node.nodeName.toLowerCase();\n    // Remove the `id` to avoid having multiple elements with the same id on the page.\n    clone.removeAttribute('id');\n    for (let i = 0; i < descendantsWithId.length; i++) {\n        descendantsWithId[i].removeAttribute('id');\n    }\n    if (nodeName === 'canvas') {\n        transferCanvasData(node, clone);\n    }\n    else if (nodeName === 'input' || nodeName === 'select' || nodeName === 'textarea') {\n        transferInputData(node, clone);\n    }\n    transferData('canvas', node, clone, transferCanvasData);\n    transferData('input, textarea, select', node, clone, transferInputData);\n    return clone;\n}\n/** Matches elements between an element and its clone and allows for their data to be cloned. */\nfunction transferData(selector, node, clone, callback) {\n    const descendantElements = node.querySelectorAll(selector);\n    if (descendantElements.length) {\n        const cloneElements = clone.querySelectorAll(selector);\n        for (let i = 0; i < descendantElements.length; i++) {\n            callback(descendantElements[i], cloneElements[i]);\n        }\n    }\n}\n// Counter for unique cloned radio button names.\nlet cloneUniqueId = 0;\n/** Transfers the data of one input element to another. */\nfunction transferInputData(source, clone) {\n    // Browsers throw an error when assigning the value of a file input programmatically.\n    if (clone.type !== 'file') {\n        clone.value = source.value;\n    }\n    // Radio button `name` attributes must be unique for radio button groups\n    // otherwise original radio buttons can lose their checked state\n    // once the clone is inserted in the DOM.\n    if (clone.type === 'radio' && clone.name) {\n        clone.name = `mat-clone-${clone.name}-${cloneUniqueId++}`;\n    }\n}\n/** Transfers the data of one canvas element to another. */\nfunction transferCanvasData(source, clone) {\n    const context = clone.getContext('2d');\n    if (context) {\n        // In some cases `drawImage` can throw (e.g. if the canvas size is 0x0).\n        // We can't do much about it so just ignore the error.\n        try {\n            context.drawImage(source, 0, 0);\n        }\n        catch (_a) { }\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/** Options that can be used to bind a passive event listener. */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({ passive: true });\n/** Options that can be used to bind an active event listener. */\nconst activeEventListenerOptions = normalizePassiveListenerOptions({ passive: false });\n/**\n * Time in milliseconds for which to ignore mouse events, after\n * receiving a touch event. Used to avoid doing double work for\n * touch devices where the browser fires fake mouse events, in\n * addition to touch events.\n */\nconst MOUSE_EVENT_IGNORE_TIME = 800;\n/**\n * Reference to a draggable item. Used to manipulate or dispose of the item.\n */\nclass DragRef {\n    constructor(element, _config, _document, _ngZone, _viewportRuler, _dragDropRegistry) {\n        this._config = _config;\n        this._document = _document;\n        this._ngZone = _ngZone;\n        this._viewportRuler = _viewportRuler;\n        this._dragDropRegistry = _dragDropRegistry;\n        /**\n         * CSS `transform` applied to the element when it isn't being dragged. We need a\n         * passive transform in order for the dragged element to retain its new position\n         * after the user has stopped dragging and because we need to know the relative\n         * position in case they start dragging again. This corresponds to `element.style.transform`.\n         */\n        this._passiveTransform = { x: 0, y: 0 };\n        /** CSS `transform` that is applied to the element while it's being dragged. */\n        this._activeTransform = { x: 0, y: 0 };\n        /** Emits when the item is being moved. */\n        this._moveEvents = new Subject();\n        /** Subscription to pointer movement events. */\n        this._pointerMoveSubscription = Subscription.EMPTY;\n        /** Subscription to the event that is dispatched when the user lifts their pointer. */\n        this._pointerUpSubscription = Subscription.EMPTY;\n        /** Subscription to the viewport being scrolled. */\n        this._scrollSubscription = Subscription.EMPTY;\n        /** Subscription to the viewport being resized. */\n        this._resizeSubscription = Subscription.EMPTY;\n        /** Cached reference to the boundary element. */\n        this._boundaryElement = null;\n        /** Whether the native dragging interactions have been enabled on the root element. */\n        this._nativeInteractionsEnabled = true;\n        /** Elements that can be used to drag the draggable item. */\n        this._handles = [];\n        /** Registered handles that are currently disabled. */\n        this._disabledHandles = new Set();\n        /** Layout direction of the item. */\n        this._direction = 'ltr';\n        /**\n         * Amount of milliseconds to wait after the user has put their\n         * pointer down before starting to drag the element.\n         */\n        this.dragStartDelay = 0;\n        this._disabled = false;\n        /** Emits as the drag sequence is being prepared. */\n        this.beforeStarted = new Subject();\n        /** Emits when the user starts dragging the item. */\n        this.started = new Subject();\n        /** Emits when the user has released a drag item, before any animations have started. */\n        this.released = new Subject();\n        /** Emits when the user stops dragging an item in the container. */\n        this.ended = new Subject();\n        /** Emits when the user has moved the item into a new container. */\n        this.entered = new Subject();\n        /** Emits when the user removes the item its container by dragging it into another container. */\n        this.exited = new Subject();\n        /** Emits when the user drops the item inside a container. */\n        this.dropped = new Subject();\n        /**\n         * Emits as the user is dragging the item. Use with caution,\n         * because this event will fire for every pixel that the user has dragged.\n         */\n        this.moved = this._moveEvents;\n        /** Handler for the `mousedown`/`touchstart` events. */\n        this._pointerDown = (event) => {\n            this.beforeStarted.next();\n            // Delegate the event based on whether it started from a handle or the element itself.\n            if (this._handles.length) {\n                const targetHandle = this._handles.find(handle => {\n                    const target = event.target;\n                    return !!target && (target === handle || handle.contains(target));\n                });\n                if (targetHandle && !this._disabledHandles.has(targetHandle) && !this.disabled) {\n                    this._initializeDragSequence(targetHandle, event);\n                }\n            }\n            else if (!this.disabled) {\n                this._initializeDragSequence(this._rootElement, event);\n            }\n        };\n        /** Handler that is invoked when the user moves their pointer after they've initiated a drag. */\n        this._pointerMove = (event) => {\n            const pointerPosition = this._getPointerPositionOnPage(event);\n            if (!this._hasStartedDragging) {\n                const distanceX = Math.abs(pointerPosition.x - this._pickupPositionOnPage.x);\n                const distanceY = Math.abs(pointerPosition.y - this._pickupPositionOnPage.y);\n                const isOverThreshold = distanceX + distanceY >= this._config.dragStartThreshold;\n                // Only start dragging after the user has moved more than the minimum distance in either\n                // direction. Note that this is preferrable over doing something like `skip(minimumDistance)`\n                // in the `pointerMove` subscription, because we're not guaranteed to have one move event\n                // per pixel of movement (e.g. if the user moves their pointer quickly).\n                if (isOverThreshold) {\n                    const isDelayElapsed = Date.now() >= this._dragStartTime + this._getDragStartDelay(event);\n                    const container = this._dropContainer;\n                    if (!isDelayElapsed) {\n                        this._endDragSequence(event);\n                        return;\n                    }\n                    // Prevent other drag sequences from starting while something in the container is still\n                    // being dragged. This can happen while we're waiting for the drop animation to finish\n                    // and can cause errors, because some elements might still be moving around.\n                    if (!container || (!container.isDragging() && !container.isReceiving())) {\n                        // Prevent the default action as soon as the dragging sequence is considered as\n                        // \"started\" since waiting for the next event can allow the device to begin scrolling.\n                        event.preventDefault();\n                        this._hasStartedDragging = true;\n                        this._ngZone.run(() => this._startDragSequence(event));\n                    }\n                }\n                return;\n            }\n            // We only need the preview dimensions if we have a boundary element.\n            if (this._boundaryElement) {\n                // Cache the preview element rect if we haven't cached it already or if\n                // we cached it too early before the element dimensions were computed.\n                if (!this._previewRect || (!this._previewRect.width && !this._previewRect.height)) {\n                    this._previewRect = (this._preview || this._rootElement).getBoundingClientRect();\n                }\n            }\n            // We prevent the default action down here so that we know that dragging has started. This is\n            // important for touch devices where doing this too early can unnecessarily block scrolling,\n            // if there's a dragging delay.\n            event.preventDefault();\n            const constrainedPointerPosition = this._getConstrainedPointerPosition(pointerPosition);\n            this._hasMoved = true;\n            this._lastKnownPointerPosition = pointerPosition;\n            this._updatePointerDirectionDelta(constrainedPointerPosition);\n            if (this._dropContainer) {\n                this._updateActiveDropContainer(constrainedPointerPosition, pointerPosition);\n            }\n            else {\n                const activeTransform = this._activeTransform;\n                activeTransform.x =\n                    constrainedPointerPosition.x - this._pickupPositionOnPage.x + this._passiveTransform.x;\n                activeTransform.y =\n                    constrainedPointerPosition.y - this._pickupPositionOnPage.y + this._passiveTransform.y;\n                this._applyRootElementTransform(activeTransform.x, activeTransform.y);\n                // Apply transform as attribute if dragging and svg element to work for IE\n                if (typeof SVGElement !== 'undefined' && this._rootElement instanceof SVGElement) {\n                    const appliedTransform = `translate(${activeTransform.x} ${activeTransform.y})`;\n                    this._rootElement.setAttribute('transform', appliedTransform);\n                }\n            }\n            // Since this event gets fired for every pixel while dragging, we only\n            // want to fire it if the consumer opted into it. Also we have to\n            // re-enter the zone because we run all of the events on the outside.\n            if (this._moveEvents.observers.length) {\n                this._ngZone.run(() => {\n                    this._moveEvents.next({\n                        source: this,\n                        pointerPosition: constrainedPointerPosition,\n                        event,\n                        distance: this._getDragDistance(constrainedPointerPosition),\n                        delta: this._pointerDirectionDelta\n                    });\n                });\n            }\n        };\n        /** Handler that is invoked when the user lifts their pointer up, after initiating a drag. */\n        this._pointerUp = (event) => {\n            this._endDragSequence(event);\n        };\n        this.withRootElement(element).withParent(_config.parentDragRef || null);\n        this._parentPositions = new ParentPositionTracker(_document, _viewportRuler);\n        _dragDropRegistry.registerDragItem(this);\n    }\n    /** Whether starting to drag this element is disabled. */\n    get disabled() {\n        return this._disabled || !!(this._dropContainer && this._dropContainer.disabled);\n    }\n    set disabled(value) {\n        const newValue = coerceBooleanProperty(value);\n        if (newValue !== this._disabled) {\n            this._disabled = newValue;\n            this._toggleNativeDragInteractions();\n            this._handles.forEach(handle => toggleNativeDragInteractions(handle, newValue));\n        }\n    }\n    /**\n     * Returns the element that is being used as a placeholder\n     * while the current element is being dragged.\n     */\n    getPlaceholderElement() {\n        return this._placeholder;\n    }\n    /** Returns the root draggable element. */\n    getRootElement() {\n        return this._rootElement;\n    }\n    /**\n     * Gets the currently-visible element that represents the drag item.\n     * While dragging this is the placeholder, otherwise it's the root element.\n     */\n    getVisibleElement() {\n        return this.isDragging() ? this.getPlaceholderElement() : this.getRootElement();\n    }\n    /** Registers the handles that can be used to drag the element. */\n    withHandles(handles) {\n        this._handles = handles.map(handle => coerceElement(handle));\n        this._handles.forEach(handle => toggleNativeDragInteractions(handle, this.disabled));\n        this._toggleNativeDragInteractions();\n        // Delete any lingering disabled handles that may have been destroyed. Note that we re-create\n        // the set, rather than iterate over it and filter out the destroyed handles, because while\n        // the ES spec allows for sets to be modified while they're being iterated over, some polyfills\n        // use an array internally which may throw an error.\n        const disabledHandles = new Set();\n        this._disabledHandles.forEach(handle => {\n            if (this._handles.indexOf(handle) > -1) {\n                disabledHandles.add(handle);\n            }\n        });\n        this._disabledHandles = disabledHandles;\n        return this;\n    }\n    /**\n     * Registers the template that should be used for the drag preview.\n     * @param template Template that from which to stamp out the preview.\n     */\n    withPreviewTemplate(template) {\n        this._previewTemplate = template;\n        return this;\n    }\n    /**\n     * Registers the template that should be used for the drag placeholder.\n     * @param template Template that from which to stamp out the placeholder.\n     */\n    withPlaceholderTemplate(template) {\n        this._placeholderTemplate = template;\n        return this;\n    }\n    /**\n     * Sets an alternate drag root element. The root element is the element that will be moved as\n     * the user is dragging. Passing an alternate root element is useful when trying to enable\n     * dragging on an element that you might not have access to.\n     */\n    withRootElement(rootElement) {\n        const element = coerceElement(rootElement);\n        if (element !== this._rootElement) {\n            if (this._rootElement) {\n                this._removeRootElementListeners(this._rootElement);\n            }\n            this._ngZone.runOutsideAngular(() => {\n                element.addEventListener('mousedown', this._pointerDown, activeEventListenerOptions);\n                element.addEventListener('touchstart', this._pointerDown, passiveEventListenerOptions);\n            });\n            this._initialTransform = undefined;\n            this._rootElement = element;\n        }\n        if (typeof SVGElement !== 'undefined' && this._rootElement instanceof SVGElement) {\n            this._ownerSVGElement = this._rootElement.ownerSVGElement;\n        }\n        return this;\n    }\n    /**\n     * Element to which the draggable's position will be constrained.\n     */\n    withBoundaryElement(boundaryElement) {\n        this._boundaryElement = boundaryElement ? coerceElement(boundaryElement) : null;\n        this._resizeSubscription.unsubscribe();\n        if (boundaryElement) {\n            this._resizeSubscription = this._viewportRuler\n                .change(10)\n                .subscribe(() => this._containInsideBoundaryOnResize());\n        }\n        return this;\n    }\n    /** Sets the parent ref that the ref is nested in.  */\n    withParent(parent) {\n        this._parentDragRef = parent;\n        return this;\n    }\n    /** Removes the dragging functionality from the DOM element. */\n    dispose() {\n        this._removeRootElementListeners(this._rootElement);\n        // Do this check before removing from the registry since it'll\n        // stop being considered as dragged once it is removed.\n        if (this.isDragging()) {\n            // Since we move out the element to the end of the body while it's being\n            // dragged, we have to make sure that it's removed if it gets destroyed.\n            removeNode(this._rootElement);\n        }\n        removeNode(this._anchor);\n        this._destroyPreview();\n        this._destroyPlaceholder();\n        this._dragDropRegistry.removeDragItem(this);\n        this._removeSubscriptions();\n        this.beforeStarted.complete();\n        this.started.complete();\n        this.released.complete();\n        this.ended.complete();\n        this.entered.complete();\n        this.exited.complete();\n        this.dropped.complete();\n        this._moveEvents.complete();\n        this._handles = [];\n        this._disabledHandles.clear();\n        this._dropContainer = undefined;\n        this._resizeSubscription.unsubscribe();\n        this._parentPositions.clear();\n        this._boundaryElement = this._rootElement = this._ownerSVGElement = this._placeholderTemplate =\n            this._previewTemplate = this._anchor = this._parentDragRef = null;\n    }\n    /** Checks whether the element is currently being dragged. */\n    isDragging() {\n        return this._hasStartedDragging && this._dragDropRegistry.isDragging(this);\n    }\n    /** Resets a standalone drag item to its initial position. */\n    reset() {\n        this._rootElement.style.transform = this._initialTransform || '';\n        this._activeTransform = { x: 0, y: 0 };\n        this._passiveTransform = { x: 0, y: 0 };\n    }\n    /**\n     * Sets a handle as disabled. While a handle is disabled, it'll capture and interrupt dragging.\n     * @param handle Handle element that should be disabled.\n     */\n    disableHandle(handle) {\n        if (!this._disabledHandles.has(handle) && this._handles.indexOf(handle) > -1) {\n            this._disabledHandles.add(handle);\n            toggleNativeDragInteractions(handle, true);\n        }\n    }\n    /**\n     * Enables a handle, if it has been disabled.\n     * @param handle Handle element to be enabled.\n     */\n    enableHandle(handle) {\n        if (this._disabledHandles.has(handle)) {\n            this._disabledHandles.delete(handle);\n            toggleNativeDragInteractions(handle, this.disabled);\n        }\n    }\n    /** Sets the layout direction of the draggable item. */\n    withDirection(direction) {\n        this._direction = direction;\n        return this;\n    }\n    /** Sets the container that the item is part of. */\n    _withDropContainer(container) {\n        this._dropContainer = container;\n    }\n    /**\n     * Gets the current position in pixels the draggable outside of a drop container.\n     */\n    getFreeDragPosition() {\n        const position = this.isDragging() ? this._activeTransform : this._passiveTransform;\n        return { x: position.x, y: position.y };\n    }\n    /**\n     * Sets the current position in pixels the draggable outside of a drop container.\n     * @param value New position to be set.\n     */\n    setFreeDragPosition(value) {\n        this._activeTransform = { x: 0, y: 0 };\n        this._passiveTransform.x = value.x;\n        this._passiveTransform.y = value.y;\n        if (!this._dropContainer) {\n            this._applyRootElementTransform(value.x, value.y);\n        }\n        return this;\n    }\n    /** Updates the item's sort order based on the last-known pointer position. */\n    _sortFromLastPointerPosition() {\n        const position = this._lastKnownPointerPosition;\n        if (position && this._dropContainer) {\n            this._updateActiveDropContainer(this._getConstrainedPointerPosition(position), position);\n        }\n    }\n    /** Unsubscribes from the global subscriptions. */\n    _removeSubscriptions() {\n        this._pointerMoveSubscription.unsubscribe();\n        this._pointerUpSubscription.unsubscribe();\n        this._scrollSubscription.unsubscribe();\n    }\n    /** Destroys the preview element and its ViewRef. */\n    _destroyPreview() {\n        if (this._preview) {\n            removeNode(this._preview);\n        }\n        if (this._previewRef) {\n            this._previewRef.destroy();\n        }\n        this._preview = this._previewRef = null;\n    }\n    /** Destroys the placeholder element and its ViewRef. */\n    _destroyPlaceholder() {\n        if (this._placeholder) {\n            removeNode(this._placeholder);\n        }\n        if (this._placeholderRef) {\n            this._placeholderRef.destroy();\n        }\n        this._placeholder = this._placeholderRef = null;\n    }\n    /**\n     * Clears subscriptions and stops the dragging sequence.\n     * @param event Browser event object that ended the sequence.\n     */\n    _endDragSequence(event) {\n        // Note that here we use `isDragging` from the service, rather than from `this`.\n        // The difference is that the one from the service reflects whether a dragging sequence\n        // has been initiated, whereas the one on `this` includes whether the user has passed\n        // the minimum dragging threshold.\n        if (!this._dragDropRegistry.isDragging(this)) {\n            return;\n        }\n        this._removeSubscriptions();\n        this._dragDropRegistry.stopDragging(this);\n        this._toggleNativeDragInteractions();\n        if (this._handles) {\n            this._rootElement.style.webkitTapHighlightColor = this._rootElementTapHighlight;\n        }\n        if (!this._hasStartedDragging) {\n            return;\n        }\n        this.released.next({ source: this });\n        if (this._dropContainer) {\n            // Stop scrolling immediately, instead of waiting for the animation to finish.\n            this._dropContainer._stopScrolling();\n            this._animatePreviewToPlaceholder().then(() => {\n                this._cleanupDragArtifacts(event);\n                this._cleanupCachedDimensions();\n                this._dragDropRegistry.stopDragging(this);\n            });\n        }\n        else {\n            // Convert the active transform into a passive one. This means that next time\n            // the user starts dragging the item, its position will be calculated relatively\n            // to the new passive transform.\n            this._passiveTransform.x = this._activeTransform.x;\n            this._passiveTransform.y = this._activeTransform.y;\n            this._ngZone.run(() => {\n                this.ended.next({\n                    source: this,\n                    distance: this._getDragDistance(this._getPointerPositionOnPage(event))\n                });\n            });\n            this._cleanupCachedDimensions();\n            this._dragDropRegistry.stopDragging(this);\n        }\n    }\n    /** Starts the dragging sequence. */\n    _startDragSequence(event) {\n        if (isTouchEvent(event)) {\n            this._lastTouchEventTime = Date.now();\n        }\n        this._toggleNativeDragInteractions();\n        const dropContainer = this._dropContainer;\n        if (dropContainer) {\n            const element = this._rootElement;\n            const parent = element.parentNode;\n            const preview = this._preview = this._createPreviewElement();\n            const placeholder = this._placeholder = this._createPlaceholderElement();\n            const anchor = this._anchor = this._anchor || this._document.createComment('');\n            // Needs to happen before the root element is moved.\n            const shadowRoot = this._getShadowRoot();\n            // Insert an anchor node so that we can restore the element's position in the DOM.\n            parent.insertBefore(anchor, element);\n            // We move the element out at the end of the body and we make it hidden, because keeping it in\n            // place will throw off the consumer's `:last-child` selectors. We can't remove the element\n            // from the DOM completely, because iOS will stop firing all subsequent events in the chain.\n            toggleVisibility(element, false);\n            this._document.body.appendChild(parent.replaceChild(placeholder, element));\n            getPreviewInsertionPoint(this._document, shadowRoot).appendChild(preview);\n            this.started.next({ source: this }); // Emit before notifying the container.\n            dropContainer.start();\n            this._initialContainer = dropContainer;\n            this._initialIndex = dropContainer.getItemIndex(this);\n        }\n        else {\n            this.started.next({ source: this });\n            this._initialContainer = this._initialIndex = undefined;\n        }\n        // Important to run after we've called `start` on the parent container\n        // so that it has had time to resolve its scrollable parents.\n        this._parentPositions.cache(dropContainer ? dropContainer.getScrollableParents() : []);\n    }\n    /**\n     * Sets up the different variables and subscriptions\n     * that will be necessary for the dragging sequence.\n     * @param referenceElement Element that started the drag sequence.\n     * @param event Browser event object that started the sequence.\n     */\n    _initializeDragSequence(referenceElement, event) {\n        // Stop propagation if the item is inside another\n        // draggable so we don't start multiple drag sequences.\n        if (this._parentDragRef) {\n            event.stopPropagation();\n        }\n        const isDragging = this.isDragging();\n        const isTouchSequence = isTouchEvent(event);\n        const isAuxiliaryMouseButton = !isTouchSequence && event.button !== 0;\n        const rootElement = this._rootElement;\n        const isSyntheticEvent = !isTouchSequence && this._lastTouchEventTime &&\n            this._lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now();\n        // If the event started from an element with the native HTML drag&drop, it'll interfere\n        // with our own dragging (e.g. `img` tags do it by default). Prevent the default action\n        // to stop it from happening. Note that preventing on `dragstart` also seems to work, but\n        // it's flaky and it fails if the user drags it away quickly. Also note that we only want\n        // to do this for `mousedown` since doing the same for `touchstart` will stop any `click`\n        // events from firing on touch devices.\n        if (event.target && event.target.draggable && event.type === 'mousedown') {\n            event.preventDefault();\n        }\n        // Abort if the user is already dragging or is using a mouse button other than the primary one.\n        if (isDragging || isAuxiliaryMouseButton || isSyntheticEvent) {\n            return;\n        }\n        // If we've got handles, we need to disable the tap highlight on the entire root element,\n        // otherwise iOS will still add it, even though all the drag interactions on the handle\n        // are disabled.\n        if (this._handles.length) {\n            this._rootElementTapHighlight = rootElement.style.webkitTapHighlightColor || '';\n            rootElement.style.webkitTapHighlightColor = 'transparent';\n        }\n        this._hasStartedDragging = this._hasMoved = false;\n        // Avoid multiple subscriptions and memory leaks when multi touch\n        // (isDragging check above isn't enough because of possible temporal and/or dimensional delays)\n        this._removeSubscriptions();\n        this._pointerMoveSubscription = this._dragDropRegistry.pointerMove.subscribe(this._pointerMove);\n        this._pointerUpSubscription = this._dragDropRegistry.pointerUp.subscribe(this._pointerUp);\n        this._scrollSubscription = this._dragDropRegistry.scroll.subscribe(scrollEvent => {\n            this._updateOnScroll(scrollEvent);\n        });\n        if (this._boundaryElement) {\n            this._boundaryRect = getMutableClientRect(this._boundaryElement);\n        }\n        // If we have a custom preview we can't know ahead of time how large it'll be so we position\n        // it next to the cursor. The exception is when the consumer has opted into making the preview\n        // the same size as the root element, in which case we do know the size.\n        const previewTemplate = this._previewTemplate;\n        this._pickupPositionInElement = previewTemplate && previewTemplate.template &&\n            !previewTemplate.matchSize ? { x: 0, y: 0 } :\n            this._getPointerPositionInElement(referenceElement, event);\n        const pointerPosition = this._pickupPositionOnPage = this._lastKnownPointerPosition =\n            this._getPointerPositionOnPage(event);\n        this._pointerDirectionDelta = { x: 0, y: 0 };\n        this._pointerPositionAtLastDirectionChange = { x: pointerPosition.x, y: pointerPosition.y };\n        this._dragStartTime = Date.now();\n        this._dragDropRegistry.startDragging(this, event);\n    }\n    /** Cleans up the DOM artifacts that were added to facilitate the element being dragged. */\n    _cleanupDragArtifacts(event) {\n        // Restore the element's visibility and insert it at its old position in the DOM.\n        // It's important that we maintain the position, because moving the element around in the DOM\n        // can throw off `NgFor` which does smart diffing and re-creates elements only when necessary,\n        // while moving the existing elements in all other cases.\n        toggleVisibility(this._rootElement, true);\n        this._anchor.parentNode.replaceChild(this._rootElement, this._anchor);\n        this._destroyPreview();\n        this._destroyPlaceholder();\n        this._boundaryRect = this._previewRect = undefined;\n        // Re-enter the NgZone since we bound `document` events on the outside.\n        this._ngZone.run(() => {\n            const container = this._dropContainer;\n            const currentIndex = container.getItemIndex(this);\n            const pointerPosition = this._getPointerPositionOnPage(event);\n            const distance = this._getDragDistance(this._getPointerPositionOnPage(event));\n            const isPointerOverContainer = container._isOverContainer(pointerPosition.x, pointerPosition.y);\n            this.ended.next({ source: this, distance });\n            this.dropped.next({\n                item: this,\n                currentIndex,\n                previousIndex: this._initialIndex,\n                container: container,\n                previousContainer: this._initialContainer,\n                isPointerOverContainer,\n                distance\n            });\n            container.drop(this, currentIndex, this._initialIndex, this._initialContainer, isPointerOverContainer, distance);\n            this._dropContainer = this._initialContainer;\n        });\n    }\n    /**\n     * Updates the item's position in its drop container, or moves it\n     * into a new one, depending on its current drag position.\n     */\n    _updateActiveDropContainer({ x, y }, { x: rawX, y: rawY }) {\n        // Drop container that draggable has been moved into.\n        let newContainer = this._initialContainer._getSiblingContainerFromPosition(this, x, y);\n        // If we couldn't find a new container to move the item into, and the item has left its\n        // initial container, check whether the it's over the initial container. This handles the\n        // case where two containers are connected one way and the user tries to undo dragging an\n        // item into a new container.\n        if (!newContainer && this._dropContainer !== this._initialContainer &&\n            this._initialContainer._isOverContainer(x, y)) {\n            newContainer = this._initialContainer;\n        }\n        if (newContainer && newContainer !== this._dropContainer) {\n            this._ngZone.run(() => {\n                // Notify the old container that the item has left.\n                this.exited.next({ item: this, container: this._dropContainer });\n                this._dropContainer.exit(this);\n                // Notify the new container that the item has entered.\n                this._dropContainer = newContainer;\n                this._dropContainer.enter(this, x, y, newContainer === this._initialContainer &&\n                    // If we're re-entering the initial container and sorting is disabled,\n                    // put item the into its starting index to begin with.\n                    newContainer.sortingDisabled ? this._initialIndex : undefined);\n                this.entered.next({\n                    item: this,\n                    container: newContainer,\n                    currentIndex: newContainer.getItemIndex(this)\n                });\n            });\n        }\n        this._dropContainer._startScrollingIfNecessary(rawX, rawY);\n        this._dropContainer._sortItem(this, x, y, this._pointerDirectionDelta);\n        this._preview.style.transform =\n            getTransform(x - this._pickupPositionInElement.x, y - this._pickupPositionInElement.y);\n    }\n    /**\n     * Creates the element that will be rendered next to the user's pointer\n     * and will be used as a preview of the element that is being dragged.\n     */\n    _createPreviewElement() {\n        const previewConfig = this._previewTemplate;\n        const previewClass = this.previewClass;\n        const previewTemplate = previewConfig ? previewConfig.template : null;\n        let preview;\n        if (previewTemplate && previewConfig) {\n            // Measure the element before we've inserted the preview\n            // since the insertion could throw off the measurement.\n            const rootRect = previewConfig.matchSize ? this._rootElement.getBoundingClientRect() : null;\n            const viewRef = previewConfig.viewContainer.createEmbeddedView(previewTemplate, previewConfig.context);\n            viewRef.detectChanges();\n            preview = getRootNode(viewRef, this._document);\n            this._previewRef = viewRef;\n            if (previewConfig.matchSize) {\n                matchElementSize(preview, rootRect);\n            }\n            else {\n                preview.style.transform =\n                    getTransform(this._pickupPositionOnPage.x, this._pickupPositionOnPage.y);\n            }\n        }\n        else {\n            const element = this._rootElement;\n            preview = deepCloneNode(element);\n            matchElementSize(preview, element.getBoundingClientRect());\n        }\n        extendStyles(preview.style, {\n            // It's important that we disable the pointer events on the preview, because\n            // it can throw off the `document.elementFromPoint` calls in the `CdkDropList`.\n            pointerEvents: 'none',\n            // We have to reset the margin, because it can throw off positioning relative to the viewport.\n            margin: '0',\n            position: 'fixed',\n            top: '0',\n            left: '0',\n            zIndex: `${this._config.zIndex || 1000}`\n        });\n        toggleNativeDragInteractions(preview, false);\n        preview.classList.add('cdk-drag-preview');\n        preview.setAttribute('dir', this._direction);\n        if (previewClass) {\n            if (Array.isArray(previewClass)) {\n                previewClass.forEach(className => preview.classList.add(className));\n            }\n            else {\n                preview.classList.add(previewClass);\n            }\n        }\n        return preview;\n    }\n    /**\n     * Animates the preview element from its current position to the location of the drop placeholder.\n     * @returns Promise that resolves when the animation completes.\n     */\n    _animatePreviewToPlaceholder() {\n        // If the user hasn't moved yet, the transitionend event won't fire.\n        if (!this._hasMoved) {\n            return Promise.resolve();\n        }\n        const placeholderRect = this._placeholder.getBoundingClientRect();\n        // Apply the class that adds a transition to the preview.\n        this._preview.classList.add('cdk-drag-animating');\n        // Move the preview to the placeholder position.\n        this._preview.style.transform = getTransform(placeholderRect.left, placeholderRect.top);\n        // If the element doesn't have a `transition`, the `transitionend` event won't fire. Since\n        // we need to trigger a style recalculation in order for the `cdk-drag-animating` class to\n        // apply its style, we take advantage of the available info to figure out whether we need to\n        // bind the event in the first place.\n        const duration = getTransformTransitionDurationInMs(this._preview);\n        if (duration === 0) {\n            return Promise.resolve();\n        }\n        return this._ngZone.runOutsideAngular(() => {\n            return new Promise(resolve => {\n                const handler = ((event) => {\n                    if (!event || (event.target === this._preview && event.propertyName === 'transform')) {\n                        this._preview.removeEventListener('transitionend', handler);\n                        resolve();\n                        clearTimeout(timeout);\n                    }\n                });\n                // If a transition is short enough, the browser might not fire the `transitionend` event.\n                // Since we know how long it's supposed to take, add a timeout with a 50% buffer that'll\n                // fire if the transition hasn't completed when it was supposed to.\n                const timeout = setTimeout(handler, duration * 1.5);\n                this._preview.addEventListener('transitionend', handler);\n            });\n        });\n    }\n    /** Creates an element that will be shown instead of the current element while dragging. */\n    _createPlaceholderElement() {\n        const placeholderConfig = this._placeholderTemplate;\n        const placeholderTemplate = placeholderConfig ? placeholderConfig.template : null;\n        let placeholder;\n        if (placeholderTemplate) {\n            this._placeholderRef = placeholderConfig.viewContainer.createEmbeddedView(placeholderTemplate, placeholderConfig.context);\n            this._placeholderRef.detectChanges();\n            placeholder = getRootNode(this._placeholderRef, this._document);\n        }\n        else {\n            placeholder = deepCloneNode(this._rootElement);\n        }\n        placeholder.classList.add('cdk-drag-placeholder');\n        return placeholder;\n    }\n    /**\n     * Figures out the coordinates at which an element was picked up.\n     * @param referenceElement Element that initiated the dragging.\n     * @param event Event that initiated the dragging.\n     */\n    _getPointerPositionInElement(referenceElement, event) {\n        const elementRect = this._rootElement.getBoundingClientRect();\n        const handleElement = referenceElement === this._rootElement ? null : referenceElement;\n        const referenceRect = handleElement ? handleElement.getBoundingClientRect() : elementRect;\n        const point = isTouchEvent(event) ? event.targetTouches[0] : event;\n        const scrollPosition = this._getViewportScrollPosition();\n        const x = point.pageX - referenceRect.left - scrollPosition.left;\n        const y = point.pageY - referenceRect.top - scrollPosition.top;\n        return {\n            x: referenceRect.left - elementRect.left + x,\n            y: referenceRect.top - elementRect.top + y\n        };\n    }\n    /** Determines the point of the page that was touched by the user. */\n    _getPointerPositionOnPage(event) {\n        const scrollPosition = this._getViewportScrollPosition();\n        const point = isTouchEvent(event) ?\n            // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n            // Also note that on real devices we're guaranteed for either `touches` or `changedTouches`\n            // to have a value, but Firefox in device emulation mode has a bug where both can be empty\n            // for `touchstart` and `touchend` so we fall back to a dummy object in order to avoid\n            // throwing an error. The value returned here will be incorrect, but since this only\n            // breaks inside a developer tool and the value is only used for secondary information,\n            // we can get away with it. See https://bugzilla.mozilla.org/show_bug.cgi?id=1615824.\n            (event.touches[0] || event.changedTouches[0] || { pageX: 0, pageY: 0 }) : event;\n        const x = point.pageX - scrollPosition.left;\n        const y = point.pageY - scrollPosition.top;\n        // if dragging SVG element, try to convert from the screen coordinate system to the SVG\n        // coordinate system\n        if (this._ownerSVGElement) {\n            const svgMatrix = this._ownerSVGElement.getScreenCTM();\n            if (svgMatrix) {\n                const svgPoint = this._ownerSVGElement.createSVGPoint();\n                svgPoint.x = x;\n                svgPoint.y = y;\n                return svgPoint.matrixTransform(svgMatrix.inverse());\n            }\n        }\n        return { x, y };\n    }\n    /** Gets the pointer position on the page, accounting for any position constraints. */\n    _getConstrainedPointerPosition(point) {\n        const dropContainerLock = this._dropContainer ? this._dropContainer.lockAxis : null;\n        let { x, y } = this.constrainPosition ? this.constrainPosition(point, this) : point;\n        if (this.lockAxis === 'x' || dropContainerLock === 'x') {\n            y = this._pickupPositionOnPage.y;\n        }\n        else if (this.lockAxis === 'y' || dropContainerLock === 'y') {\n            x = this._pickupPositionOnPage.x;\n        }\n        if (this._boundaryRect) {\n            const { x: pickupX, y: pickupY } = this._pickupPositionInElement;\n            const boundaryRect = this._boundaryRect;\n            const previewRect = this._previewRect;\n            const minY = boundaryRect.top + pickupY;\n            const maxY = boundaryRect.bottom - (previewRect.height - pickupY);\n            const minX = boundaryRect.left + pickupX;\n            const maxX = boundaryRect.right - (previewRect.width - pickupX);\n            x = clamp(x, minX, maxX);\n            y = clamp(y, minY, maxY);\n        }\n        return { x, y };\n    }\n    /** Updates the current drag delta, based on the user's current pointer position on the page. */\n    _updatePointerDirectionDelta(pointerPositionOnPage) {\n        const { x, y } = pointerPositionOnPage;\n        const delta = this._pointerDirectionDelta;\n        const positionSinceLastChange = this._pointerPositionAtLastDirectionChange;\n        // Amount of pixels the user has dragged since the last time the direction changed.\n        const changeX = Math.abs(x - positionSinceLastChange.x);\n        const changeY = Math.abs(y - positionSinceLastChange.y);\n        // Because we handle pointer events on a per-pixel basis, we don't want the delta\n        // to change for every pixel, otherwise anything that depends on it can look erratic.\n        // To make the delta more consistent, we track how much the user has moved since the last\n        // delta change and we only update it after it has reached a certain threshold.\n        if (changeX > this._config.pointerDirectionChangeThreshold) {\n            delta.x = x > positionSinceLastChange.x ? 1 : -1;\n            positionSinceLastChange.x = x;\n        }\n        if (changeY > this._config.pointerDirectionChangeThreshold) {\n            delta.y = y > positionSinceLastChange.y ? 1 : -1;\n            positionSinceLastChange.y = y;\n        }\n        return delta;\n    }\n    /** Toggles the native drag interactions, based on how many handles are registered. */\n    _toggleNativeDragInteractions() {\n        if (!this._rootElement || !this._handles) {\n            return;\n        }\n        const shouldEnable = this._handles.length > 0 || !this.isDragging();\n        if (shouldEnable !== this._nativeInteractionsEnabled) {\n            this._nativeInteractionsEnabled = shouldEnable;\n            toggleNativeDragInteractions(this._rootElement, shouldEnable);\n        }\n    }\n    /** Removes the manually-added event listeners from the root element. */\n    _removeRootElementListeners(element) {\n        element.removeEventListener('mousedown', this._pointerDown, activeEventListenerOptions);\n        element.removeEventListener('touchstart', this._pointerDown, passiveEventListenerOptions);\n    }\n    /**\n     * Applies a `transform` to the root element, taking into account any existing transforms on it.\n     * @param x New transform value along the X axis.\n     * @param y New transform value along the Y axis.\n     */\n    _applyRootElementTransform(x, y) {\n        const transform = getTransform(x, y);\n        // Cache the previous transform amount only after the first drag sequence, because\n        // we don't want our own transforms to stack on top of each other.\n        if (this._initialTransform == null) {\n            this._initialTransform = this._rootElement.style.transform || '';\n        }\n        // Preserve the previous `transform` value, if there was one. Note that we apply our own\n        // transform before the user's, because things like rotation can affect which direction\n        // the element will be translated towards.\n        this._rootElement.style.transform = this._initialTransform ?\n            transform + ' ' + this._initialTransform : transform;\n    }\n    /**\n     * Gets the distance that the user has dragged during the current drag sequence.\n     * @param currentPosition Current position of the user's pointer.\n     */\n    _getDragDistance(currentPosition) {\n        const pickupPosition = this._pickupPositionOnPage;\n        if (pickupPosition) {\n            return { x: currentPosition.x - pickupPosition.x, y: currentPosition.y - pickupPosition.y };\n        }\n        return { x: 0, y: 0 };\n    }\n    /** Cleans up any cached element dimensions that we don't need after dragging has stopped. */\n    _cleanupCachedDimensions() {\n        this._boundaryRect = this._previewRect = undefined;\n        this._parentPositions.clear();\n    }\n    /**\n     * Checks whether the element is still inside its boundary after the viewport has been resized.\n     * If not, the position is adjusted so that the element fits again.\n     */\n    _containInsideBoundaryOnResize() {\n        let { x, y } = this._passiveTransform;\n        if ((x === 0 && y === 0) || this.isDragging() || !this._boundaryElement) {\n            return;\n        }\n        const boundaryRect = this._boundaryElement.getBoundingClientRect();\n        const elementRect = this._rootElement.getBoundingClientRect();\n        // It's possible that the element got hidden away after dragging (e.g. by switching to a\n        // different tab). Don't do anything in this case so we don't clear the user's position.\n        if ((boundaryRect.width === 0 && boundaryRect.height === 0) ||\n            (elementRect.width === 0 && elementRect.height === 0)) {\n            return;\n        }\n        const leftOverflow = boundaryRect.left - elementRect.left;\n        const rightOverflow = elementRect.right - boundaryRect.right;\n        const topOverflow = boundaryRect.top - elementRect.top;\n        const bottomOverflow = elementRect.bottom - boundaryRect.bottom;\n        // If the element has become wider than the boundary, we can't\n        // do much to make it fit so we just anchor it to the left.\n        if (boundaryRect.width > elementRect.width) {\n            if (leftOverflow > 0) {\n                x += leftOverflow;\n            }\n            if (rightOverflow > 0) {\n                x -= rightOverflow;\n            }\n        }\n        else {\n            x = 0;\n        }\n        // If the element has become taller than the boundary, we can't\n        // do much to make it fit so we just anchor it to the top.\n        if (boundaryRect.height > elementRect.height) {\n            if (topOverflow > 0) {\n                y += topOverflow;\n            }\n            if (bottomOverflow > 0) {\n                y -= bottomOverflow;\n            }\n        }\n        else {\n            y = 0;\n        }\n        if (x !== this._passiveTransform.x || y !== this._passiveTransform.y) {\n            this.setFreeDragPosition({ y, x });\n        }\n    }\n    /** Gets the drag start delay, based on the event type. */\n    _getDragStartDelay(event) {\n        const value = this.dragStartDelay;\n        if (typeof value === 'number') {\n            return value;\n        }\n        else if (isTouchEvent(event)) {\n            return value.touch;\n        }\n        return value ? value.mouse : 0;\n    }\n    /** Updates the internal state of the draggable element when scrolling has occurred. */\n    _updateOnScroll(event) {\n        const scrollDifference = this._parentPositions.handleScroll(event);\n        if (scrollDifference) {\n            const target = event.target;\n            // ClientRect dimensions are based on the scroll position of the page and its parent node so\n            // we have to update the cached boundary ClientRect if the user has scrolled. Check for\n            // the `document` specifically since IE doesn't support `contains` on it.\n            if (this._boundaryRect && (target === this._document ||\n                (target !== this._boundaryElement && target.contains(this._boundaryElement)))) {\n                adjustClientRect(this._boundaryRect, scrollDifference.top, scrollDifference.left);\n            }\n            this._pickupPositionOnPage.x += scrollDifference.left;\n            this._pickupPositionOnPage.y += scrollDifference.top;\n            // If we're in free drag mode, we have to update the active transform, because\n            // it isn't relative to the viewport like the preview inside a drop list.\n            if (!this._dropContainer) {\n                this._activeTransform.x -= scrollDifference.left;\n                this._activeTransform.y -= scrollDifference.top;\n                this._applyRootElementTransform(this._activeTransform.x, this._activeTransform.y);\n            }\n        }\n    }\n    /** Gets the scroll position of the viewport. */\n    _getViewportScrollPosition() {\n        const cachedPosition = this._parentPositions.positions.get(this._document);\n        return cachedPosition ? cachedPosition.scrollPosition :\n            this._viewportRuler.getViewportScrollPosition();\n    }\n    /**\n     * Lazily resolves and returns the shadow root of the element. We do this in a function, rather\n     * than saving it in property directly on init, because we want to resolve it as late as possible\n     * in order to ensure that the element has been moved into the shadow DOM. Doing it inside the\n     * constructor might be too early if the element is inside of something like `ngFor` or `ngIf`.\n     */\n    _getShadowRoot() {\n        if (this._cachedShadowRoot === undefined) {\n            this._cachedShadowRoot = _getShadowRoot(this._rootElement);\n        }\n        return this._cachedShadowRoot;\n    }\n}\n/**\n * Gets a 3d `transform` that can be applied to an element.\n * @param x Desired position of the element along the X axis.\n * @param y Desired position of the element along the Y axis.\n */\nfunction getTransform(x, y) {\n    // Round the transforms since some browsers will\n    // blur the elements for sub-pixel transforms.\n    return `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;\n}\n/** Clamps a value between a minimum and a maximum. */\nfunction clamp(value, min, max) {\n    return Math.max(min, Math.min(max, value));\n}\n/**\n * Helper to remove a node from the DOM and to do all the necessary null checks.\n * @param node Node to be removed.\n */\nfunction removeNode(node) {\n    if (node && node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\n/** Determines whether an event is a touch event. */\nfunction isTouchEvent(event) {\n    // This function is called for every pixel that the user has dragged so we need it to be\n    // as fast as possible. Since we only bind mouse events and touch events, we can assume\n    // that if the event's name starts with `t`, it's a touch event.\n    return event.type[0] === 't';\n}\n/** Gets the element into which the drag preview should be inserted. */\nfunction getPreviewInsertionPoint(documentRef, shadowRoot) {\n    // We can't use the body if the user is in fullscreen mode,\n    // because the preview will render under the fullscreen element.\n    // TODO(crisbeto): dedupe this with the `FullscreenOverlayContainer` eventually.\n    return shadowRoot ||\n        documentRef.fullscreenElement ||\n        documentRef.webkitFullscreenElement ||\n        documentRef.mozFullScreenElement ||\n        documentRef.msFullscreenElement ||\n        documentRef.body;\n}\n/**\n * Gets the root HTML element of an embedded view.\n * If the root is not an HTML element it gets wrapped in one.\n */\nfunction getRootNode(viewRef, _document) {\n    const rootNodes = viewRef.rootNodes;\n    if (rootNodes.length === 1 && rootNodes[0].nodeType === _document.ELEMENT_NODE) {\n        return rootNodes[0];\n    }\n    const wrapper = _document.createElement('div');\n    rootNodes.forEach(node => wrapper.appendChild(node));\n    return wrapper;\n}\n/**\n * Matches the target element's size to the source's size.\n * @param target Element that needs to be resized.\n * @param sourceRect Dimensions of the source element.\n */\nfunction matchElementSize(target, sourceRect) {\n    target.style.width = `${sourceRect.width}px`;\n    target.style.height = `${sourceRect.height}px`;\n    target.style.transform = getTransform(sourceRect.left, sourceRect.top);\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 * Moves an item one index in an array to another.\n * @param array Array in which to move the item.\n * @param fromIndex Starting index of the item.\n * @param toIndex Index to which the item should be moved.\n */\nfunction moveItemInArray(array, fromIndex, toIndex) {\n    const from = clamp$1(fromIndex, array.length - 1);\n    const to = clamp$1(toIndex, array.length - 1);\n    if (from === to) {\n        return;\n    }\n    const target = array[from];\n    const delta = to < from ? -1 : 1;\n    for (let i = from; i !== to; i += delta) {\n        array[i] = array[i + delta];\n    }\n    array[to] = target;\n}\n/**\n * Moves an item from one array to another.\n * @param currentArray Array from which to transfer the item.\n * @param targetArray Array into which to put the item.\n * @param currentIndex Index of the item in its current array.\n * @param targetIndex Index at which to insert the item.\n */\nfunction transferArrayItem(currentArray, targetArray, currentIndex, targetIndex) {\n    const from = clamp$1(currentIndex, currentArray.length - 1);\n    const to = clamp$1(targetIndex, targetArray.length);\n    if (currentArray.length) {\n        targetArray.splice(to, 0, currentArray.splice(from, 1)[0]);\n    }\n}\n/**\n * Copies an item from one array to another, leaving it in its\n * original position in current array.\n * @param currentArray Array from which to copy the item.\n * @param targetArray Array into which is copy the item.\n * @param currentIndex Index of the item in its current array.\n * @param targetIndex Index at which to insert the item.\n *\n */\nfunction copyArrayItem(currentArray, targetArray, currentIndex, targetIndex) {\n    const to = clamp$1(targetIndex, targetArray.length);\n    if (currentArray.length) {\n        targetArray.splice(to, 0, currentArray[currentIndex]);\n    }\n}\n/** Clamps a number between zero and a maximum. */\nfunction clamp$1(value, max) {\n    return Math.max(0, Math.min(max, value));\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 * Proximity, as a ratio to width/height, at which a\n * dragged item will affect the drop container.\n */\nconst DROP_PROXIMITY_THRESHOLD = 0.05;\n/**\n * Proximity, as a ratio to width/height at which to start auto-scrolling the drop list or the\n * viewport. The value comes from trying it out manually until it feels right.\n */\nconst SCROLL_PROXIMITY_THRESHOLD = 0.05;\n/**\n * Reference to a drop list. Used to manipulate or dispose of the container.\n */\nclass DropListRef {\n    constructor(element, _dragDropRegistry, _document, _ngZone, _viewportRuler) {\n        this._dragDropRegistry = _dragDropRegistry;\n        this._ngZone = _ngZone;\n        this._viewportRuler = _viewportRuler;\n        /** Whether starting a dragging sequence from this container is disabled. */\n        this.disabled = false;\n        /** Whether sorting items within the list is disabled. */\n        this.sortingDisabled = false;\n        /**\n         * Whether auto-scrolling the view when the user\n         * moves their pointer close to the edges is disabled.\n         */\n        this.autoScrollDisabled = false;\n        /** Number of pixels to scroll for each frame when auto-scrolling an element. */\n        this.autoScrollStep = 2;\n        /**\n         * Function that is used to determine whether an item\n         * is allowed to be moved into a drop container.\n         */\n        this.enterPredicate = () => true;\n        /** Functions that is used to determine whether an item can be sorted into a particular index. */\n        this.sortPredicate = () => true;\n        /** Emits right before dragging has started. */\n        this.beforeStarted = new Subject();\n        /**\n         * Emits when the user has moved a new drag item into this container.\n         */\n        this.entered = new Subject();\n        /**\n         * Emits when the user removes an item from the container\n         * by dragging it into another container.\n         */\n        this.exited = new Subject();\n        /** Emits when the user drops an item inside the container. */\n        this.dropped = new Subject();\n        /** Emits as the user is swapping items while actively dragging. */\n        this.sorted = new Subject();\n        /** Whether an item in the list is being dragged. */\n        this._isDragging = false;\n        /** Cache of the dimensions of all the items inside the container. */\n        this._itemPositions = [];\n        /**\n         * Keeps track of the item that was last swapped with the dragged item, as well as what direction\n         * the pointer was moving in when the swap occured and whether the user's pointer continued to\n         * overlap with the swapped item after the swapping occurred.\n         */\n        this._previousSwap = { drag: null, delta: 0, overlaps: false };\n        /** Draggable items in the container. */\n        this._draggables = [];\n        /** Drop lists that are connected to the current one. */\n        this._siblings = [];\n        /** Direction in which the list is oriented. */\n        this._orientation = 'vertical';\n        /** Connected siblings that currently have a dragged item. */\n        this._activeSiblings = new Set();\n        /** Layout direction of the drop list. */\n        this._direction = 'ltr';\n        /** Subscription to the window being scrolled. */\n        this._viewportScrollSubscription = Subscription.EMPTY;\n        /** Vertical direction in which the list is currently scrolling. */\n        this._verticalScrollDirection = 0 /* NONE */;\n        /** Horizontal direction in which the list is currently scrolling. */\n        this._horizontalScrollDirection = 0 /* NONE */;\n        /** Used to signal to the current auto-scroll sequence when to stop. */\n        this._stopScrollTimers = new Subject();\n        /** Shadow root of the current element. Necessary for `elementFromPoint` to resolve correctly. */\n        this._cachedShadowRoot = null;\n        /** Starts the interval that'll auto-scroll the element. */\n        this._startScrollInterval = () => {\n            this._stopScrolling();\n            interval(0, animationFrameScheduler)\n                .pipe(takeUntil(this._stopScrollTimers))\n                .subscribe(() => {\n                const node = this._scrollNode;\n                const scrollStep = this.autoScrollStep;\n                if (this._verticalScrollDirection === 1 /* UP */) {\n                    incrementVerticalScroll(node, -scrollStep);\n                }\n                else if (this._verticalScrollDirection === 2 /* DOWN */) {\n                    incrementVerticalScroll(node, scrollStep);\n                }\n                if (this._horizontalScrollDirection === 1 /* LEFT */) {\n                    incrementHorizontalScroll(node, -scrollStep);\n                }\n                else if (this._horizontalScrollDirection === 2 /* RIGHT */) {\n                    incrementHorizontalScroll(node, scrollStep);\n                }\n            });\n        };\n        this.element = coerceElement(element);\n        this._document = _document;\n        this.withScrollableParents([this.element]);\n        _dragDropRegistry.registerDropContainer(this);\n        this._parentPositions = new ParentPositionTracker(_document, _viewportRuler);\n    }\n    /** Removes the drop list functionality from the DOM element. */\n    dispose() {\n        this._stopScrolling();\n        this._stopScrollTimers.complete();\n        this._viewportScrollSubscription.unsubscribe();\n        this.beforeStarted.complete();\n        this.entered.complete();\n        this.exited.complete();\n        this.dropped.complete();\n        this.sorted.complete();\n        this._activeSiblings.clear();\n        this._scrollNode = null;\n        this._parentPositions.clear();\n        this._dragDropRegistry.removeDropContainer(this);\n    }\n    /** Whether an item from this list is currently being dragged. */\n    isDragging() {\n        return this._isDragging;\n    }\n    /** Starts dragging an item. */\n    start() {\n        this._draggingStarted();\n        this._notifyReceivingSiblings();\n    }\n    /**\n     * Emits an event to indicate that the user moved an item into the container.\n     * @param item Item that was moved into the container.\n     * @param pointerX Position of the item along the X axis.\n     * @param pointerY Position of the item along the Y axis.\n     * @param index Index at which the item entered. If omitted, the container will try to figure it\n     *   out automatically.\n     */\n    enter(item, pointerX, pointerY, index) {\n        this._draggingStarted();\n        // If sorting is disabled, we want the item to return to its starting\n        // position if the user is returning it to its initial container.\n        let newIndex;\n        if (index == null) {\n            newIndex = this.sortingDisabled ? this._draggables.indexOf(item) : -1;\n            if (newIndex === -1) {\n                // We use the coordinates of where the item entered the drop\n                // zone to figure out at which index it should be inserted.\n                newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY);\n            }\n        }\n        else {\n            newIndex = index;\n        }\n        const activeDraggables = this._activeDraggables;\n        const currentIndex = activeDraggables.indexOf(item);\n        const placeholder = item.getPlaceholderElement();\n        let newPositionReference = activeDraggables[newIndex];\n        // If the item at the new position is the same as the item that is being dragged,\n        // it means that we're trying to restore the item to its initial position. In this\n        // case we should use the next item from the list as the reference.\n        if (newPositionReference === item) {\n            newPositionReference = activeDraggables[newIndex + 1];\n        }\n        // Since the item may be in the `activeDraggables` already (e.g. if the user dragged it\n        // into another container and back again), we have to ensure that it isn't duplicated.\n        if (currentIndex > -1) {\n            activeDraggables.splice(currentIndex, 1);\n        }\n        // Don't use items that are being dragged as a reference, because\n        // their element has been moved down to the bottom of the body.\n        if (newPositionReference && !this._dragDropRegistry.isDragging(newPositionReference)) {\n            const element = newPositionReference.getRootElement();\n            element.parentElement.insertBefore(placeholder, element);\n            activeDraggables.splice(newIndex, 0, item);\n        }\n        else if (this._shouldEnterAsFirstChild(pointerX, pointerY)) {\n            const reference = activeDraggables[0].getRootElement();\n            reference.parentNode.insertBefore(placeholder, reference);\n            activeDraggables.unshift(item);\n        }\n        else {\n            coerceElement(this.element).appendChild(placeholder);\n            activeDraggables.push(item);\n        }\n        // The transform needs to be cleared so it doesn't throw off the measurements.\n        placeholder.style.transform = '';\n        // Note that the positions were already cached when we called `start` above,\n        // but we need to refresh them since the amount of items has changed and also parent rects.\n        this._cacheItemPositions();\n        this._cacheParentPositions();\n        // Notify siblings at the end so that the item has been inserted into the `activeDraggables`.\n        this._notifyReceivingSiblings();\n        this.entered.next({ item, container: this, currentIndex: this.getItemIndex(item) });\n    }\n    /**\n     * Removes an item from the container after it was dragged into another container by the user.\n     * @param item Item that was dragged out.\n     */\n    exit(item) {\n        this._reset();\n        this.exited.next({ item, container: this });\n    }\n    /**\n     * Drops an item into this container.\n     * @param item Item being dropped into the container.\n     * @param currentIndex Index at which the item should be inserted.\n     * @param previousIndex Index of the item when dragging started.\n     * @param previousContainer Container from which the item got dragged in.\n     * @param isPointerOverContainer Whether the user's pointer was over the\n     *    container when the item was dropped.\n     * @param distance Distance the user has dragged since the start of the dragging sequence.\n     */\n    drop(item, currentIndex, previousIndex, previousContainer, isPointerOverContainer, distance) {\n        this._reset();\n        this.dropped.next({\n            item,\n            currentIndex,\n            previousIndex,\n            container: this,\n            previousContainer,\n            isPointerOverContainer,\n            distance\n        });\n    }\n    /**\n     * Sets the draggable items that are a part of this list.\n     * @param items Items that are a part of this list.\n     */\n    withItems(items) {\n        const previousItems = this._draggables;\n        this._draggables = items;\n        items.forEach(item => item._withDropContainer(this));\n        if (this.isDragging()) {\n            const draggedItems = previousItems.filter(item => item.isDragging());\n            // If all of the items being dragged were removed\n            // from the list, abort the current drag sequence.\n            if (draggedItems.every(item => items.indexOf(item) === -1)) {\n                this._reset();\n            }\n            else {\n                this._cacheItems();\n            }\n        }\n        return this;\n    }\n    /** Sets the layout direction of the drop list. */\n    withDirection(direction) {\n        this._direction = direction;\n        return this;\n    }\n    /**\n     * Sets the containers that are connected to this one. When two or more containers are\n     * connected, the user will be allowed to transfer items between them.\n     * @param connectedTo Other containers that the current containers should be connected to.\n     */\n    connectedTo(connectedTo) {\n        this._siblings = connectedTo.slice();\n        return this;\n    }\n    /**\n     * Sets the orientation of the container.\n     * @param orientation New orientation for the container.\n     */\n    withOrientation(orientation) {\n        this._orientation = orientation;\n        return this;\n    }\n    /**\n     * Sets which parent elements are can be scrolled while the user is dragging.\n     * @param elements Elements that can be scrolled.\n     */\n    withScrollableParents(elements) {\n        const element = coerceElement(this.element);\n        // We always allow the current element to be scrollable\n        // so we need to ensure that it's in the array.\n        this._scrollableElements =\n            elements.indexOf(element) === -1 ? [element, ...elements] : elements.slice();\n        return this;\n    }\n    /** Gets the scrollable parents that are registered with this drop container. */\n    getScrollableParents() {\n        return this._scrollableElements;\n    }\n    /**\n     * Figures out the index of an item in the container.\n     * @param item Item whose index should be determined.\n     */\n    getItemIndex(item) {\n        if (!this._isDragging) {\n            return this._draggables.indexOf(item);\n        }\n        // Items are sorted always by top/left in the cache, however they flow differently in RTL.\n        // The rest of the logic still stands no matter what orientation we're in, however\n        // we need to invert the array when determining the index.\n        const items = this._orientation === 'horizontal' && this._direction === 'rtl' ?\n            this._itemPositions.slice().reverse() : this._itemPositions;\n        return findIndex(items, currentItem => currentItem.drag === item);\n    }\n    /**\n     * Whether the list is able to receive the item that\n     * is currently being dragged inside a connected drop list.\n     */\n    isReceiving() {\n        return this._activeSiblings.size > 0;\n    }\n    /**\n     * Sorts an item inside the container based on its position.\n     * @param item Item to be sorted.\n     * @param pointerX Position of the item along the X axis.\n     * @param pointerY Position of the item along the Y axis.\n     * @param pointerDelta Direction in which the pointer is moving along each axis.\n     */\n    _sortItem(item, pointerX, pointerY, pointerDelta) {\n        // Don't sort the item if sorting is disabled or it's out of range.\n        if (this.sortingDisabled || !this._clientRect ||\n            !isPointerNearClientRect(this._clientRect, DROP_PROXIMITY_THRESHOLD, pointerX, pointerY)) {\n            return;\n        }\n        const siblings = this._itemPositions;\n        const newIndex = this._getItemIndexFromPointerPosition(item, pointerX, pointerY, pointerDelta);\n        if (newIndex === -1 && siblings.length > 0) {\n            return;\n        }\n        const isHorizontal = this._orientation === 'horizontal';\n        const currentIndex = findIndex(siblings, currentItem => currentItem.drag === item);\n        const siblingAtNewPosition = siblings[newIndex];\n        const currentPosition = siblings[currentIndex].clientRect;\n        const newPosition = siblingAtNewPosition.clientRect;\n        const delta = currentIndex > newIndex ? 1 : -1;\n        // How many pixels the item's placeholder should be offset.\n        const itemOffset = this._getItemOffsetPx(currentPosition, newPosition, delta);\n        // How many pixels all the other items should be offset.\n        const siblingOffset = this._getSiblingOffsetPx(currentIndex, siblings, delta);\n        // Save the previous order of the items before moving the item to its new index.\n        // We use this to check whether an item has been moved as a result of the sorting.\n        const oldOrder = siblings.slice();\n        // Shuffle the array in place.\n        moveItemInArray(siblings, currentIndex, newIndex);\n        this.sorted.next({\n            previousIndex: currentIndex,\n            currentIndex: newIndex,\n            container: this,\n            item\n        });\n        siblings.forEach((sibling, index) => {\n            // Don't do anything if the position hasn't changed.\n            if (oldOrder[index] === sibling) {\n                return;\n            }\n            const isDraggedItem = sibling.drag === item;\n            const offset = isDraggedItem ? itemOffset : siblingOffset;\n            const elementToOffset = isDraggedItem ? item.getPlaceholderElement() :\n                sibling.drag.getRootElement();\n            // Update the offset to reflect the new position.\n            sibling.offset += offset;\n            // Since we're moving the items with a `transform`, we need to adjust their cached\n            // client rects to reflect their new position, as well as swap their positions in the cache.\n            // Note that we shouldn't use `getBoundingClientRect` here to update the cache, because the\n            // elements may be mid-animation which will give us a wrong result.\n            if (isHorizontal) {\n                // Round the transforms since some browsers will\n                // blur the elements, for sub-pixel transforms.\n                elementToOffset.style.transform = `translate3d(${Math.round(sibling.offset)}px, 0, 0)`;\n                adjustClientRect(sibling.clientRect, 0, offset);\n            }\n            else {\n                elementToOffset.style.transform = `translate3d(0, ${Math.round(sibling.offset)}px, 0)`;\n                adjustClientRect(sibling.clientRect, offset, 0);\n            }\n        });\n        // Note that it's important that we do this after the client rects have been adjusted.\n        this._previousSwap.overlaps = isInsideClientRect(newPosition, pointerX, pointerY);\n        this._previousSwap.drag = siblingAtNewPosition.drag;\n        this._previousSwap.delta = isHorizontal ? pointerDelta.x : pointerDelta.y;\n    }\n    /**\n     * Checks whether the user's pointer is close to the edges of either the\n     * viewport or the drop list and starts the auto-scroll sequence.\n     * @param pointerX User's pointer position along the x axis.\n     * @param pointerY User's pointer position along the y axis.\n     */\n    _startScrollingIfNecessary(pointerX, pointerY) {\n        if (this.autoScrollDisabled) {\n            return;\n        }\n        let scrollNode;\n        let verticalScrollDirection = 0 /* NONE */;\n        let horizontalScrollDirection = 0 /* NONE */;\n        // Check whether we should start scrolling any of the parent containers.\n        this._parentPositions.positions.forEach((position, element) => {\n            // We have special handling for the `document` below. Also this would be\n            // nicer with a  for...of loop, but it requires changing a compiler flag.\n            if (element === this._document || !position.clientRect || scrollNode) {\n                return;\n            }\n            if (isPointerNearClientRect(position.clientRect, DROP_PROXIMITY_THRESHOLD, pointerX, pointerY)) {\n                [verticalScrollDirection, horizontalScrollDirection] = getElementScrollDirections(element, position.clientRect, pointerX, pointerY);\n                if (verticalScrollDirection || horizontalScrollDirection) {\n                    scrollNode = element;\n                }\n            }\n        });\n        // Otherwise check if we can start scrolling the viewport.\n        if (!verticalScrollDirection && !horizontalScrollDirection) {\n            const { width, height } = this._viewportRuler.getViewportSize();\n            const clientRect = { width, height, top: 0, right: width, bottom: height, left: 0 };\n            verticalScrollDirection = getVerticalScrollDirection(clientRect, pointerY);\n            horizontalScrollDirection = getHorizontalScrollDirection(clientRect, pointerX);\n            scrollNode = window;\n        }\n        if (scrollNode && (verticalScrollDirection !== this._verticalScrollDirection ||\n            horizontalScrollDirection !== this._horizontalScrollDirection ||\n            scrollNode !== this._scrollNode)) {\n            this._verticalScrollDirection = verticalScrollDirection;\n            this._horizontalScrollDirection = horizontalScrollDirection;\n            this._scrollNode = scrollNode;\n            if ((verticalScrollDirection || horizontalScrollDirection) && scrollNode) {\n                this._ngZone.runOutsideAngular(this._startScrollInterval);\n            }\n            else {\n                this._stopScrolling();\n            }\n        }\n    }\n    /** Stops any currently-running auto-scroll sequences. */\n    _stopScrolling() {\n        this._stopScrollTimers.next();\n    }\n    /** Starts the dragging sequence within the list. */\n    _draggingStarted() {\n        const styles = coerceElement(this.element).style;\n        this.beforeStarted.next();\n        this._isDragging = true;\n        // We need to disable scroll snapping while the user is dragging, because it breaks automatic\n        // scrolling. The browser seems to round the value based on the snapping points which means\n        // that we can't increment/decrement the scroll position.\n        this._initialScrollSnap = styles.msScrollSnapType || styles.scrollSnapType || '';\n        styles.scrollSnapType = styles.msScrollSnapType = 'none';\n        this._cacheItems();\n        this._viewportScrollSubscription.unsubscribe();\n        this._listenToScrollEvents();\n    }\n    /** Caches the positions of the configured scrollable parents. */\n    _cacheParentPositions() {\n        const element = coerceElement(this.element);\n        this._parentPositions.cache(this._scrollableElements);\n        // The list element is always in the `scrollableElements`\n        // so we can take advantage of the cached `ClientRect`.\n        this._clientRect = this._parentPositions.positions.get(element).clientRect;\n    }\n    /** Refreshes the position cache of the items and sibling containers. */\n    _cacheItemPositions() {\n        const isHorizontal = this._orientation === 'horizontal';\n        this._itemPositions = this._activeDraggables.map(drag => {\n            const elementToMeasure = drag.getVisibleElement();\n            return { drag, offset: 0, clientRect: getMutableClientRect(elementToMeasure) };\n        }).sort((a, b) => {\n            return isHorizontal ? a.clientRect.left - b.clientRect.left :\n                a.clientRect.top - b.clientRect.top;\n        });\n    }\n    /** Resets the container to its initial state. */\n    _reset() {\n        this._isDragging = false;\n        const styles = coerceElement(this.element).style;\n        styles.scrollSnapType = styles.msScrollSnapType = this._initialScrollSnap;\n        // TODO(crisbeto): may have to wait for the animations to finish.\n        this._activeDraggables.forEach(item => {\n            const rootElement = item.getRootElement();\n            if (rootElement) {\n                rootElement.style.transform = '';\n            }\n        });\n        this._siblings.forEach(sibling => sibling._stopReceiving(this));\n        this._activeDraggables = [];\n        this._itemPositions = [];\n        this._previousSwap.drag = null;\n        this._previousSwap.delta = 0;\n        this._previousSwap.overlaps = false;\n        this._stopScrolling();\n        this._viewportScrollSubscription.unsubscribe();\n        this._parentPositions.clear();\n    }\n    /**\n     * Gets the offset in pixels by which the items that aren't being dragged should be moved.\n     * @param currentIndex Index of the item currently being dragged.\n     * @param siblings All of the items in the list.\n     * @param delta Direction in which the user is moving.\n     */\n    _getSiblingOffsetPx(currentIndex, siblings, delta) {\n        const isHorizontal = this._orientation === 'horizontal';\n        const currentPosition = siblings[currentIndex].clientRect;\n        const immediateSibling = siblings[currentIndex + delta * -1];\n        let siblingOffset = currentPosition[isHorizontal ? 'width' : 'height'] * delta;\n        if (immediateSibling) {\n            const start = isHorizontal ? 'left' : 'top';\n            const end = isHorizontal ? 'right' : 'bottom';\n            // Get the spacing between the start of the current item and the end of the one immediately\n            // after it in the direction in which the user is dragging, or vice versa. We add it to the\n            // offset in order to push the element to where it will be when it's inline and is influenced\n            // by the `margin` of its siblings.\n            if (delta === -1) {\n                siblingOffset -= immediateSibling.clientRect[start] - currentPosition[end];\n            }\n            else {\n                siblingOffset += currentPosition[start] - immediateSibling.clientRect[end];\n            }\n        }\n        return siblingOffset;\n    }\n    /**\n     * Gets the offset in pixels by which the item that is being dragged should be moved.\n     * @param currentPosition Current position of the item.\n     * @param newPosition Position of the item where the current item should be moved.\n     * @param delta Direction in which the user is moving.\n     */\n    _getItemOffsetPx(currentPosition, newPosition, delta) {\n        const isHorizontal = this._orientation === 'horizontal';\n        let itemOffset = isHorizontal ? newPosition.left - currentPosition.left :\n            newPosition.top - currentPosition.top;\n        // Account for differences in the item width/height.\n        if (delta === -1) {\n            itemOffset += isHorizontal ? newPosition.width - currentPosition.width :\n                newPosition.height - currentPosition.height;\n        }\n        return itemOffset;\n    }\n    /**\n     * Checks if pointer is entering in the first position\n     * @param pointerX Position of the user's pointer along the X axis.\n     * @param pointerY Position of the user's pointer along the Y axis.\n     */\n    _shouldEnterAsFirstChild(pointerX, pointerY) {\n        if (!this._activeDraggables.length) {\n            return false;\n        }\n        const itemPositions = this._itemPositions;\n        const isHorizontal = this._orientation === 'horizontal';\n        // `itemPositions` are sorted by position while `activeDraggables` are sorted by child index\n        // check if container is using some sort of \"reverse\" ordering (eg: flex-direction: row-reverse)\n        const reversed = itemPositions[0].drag !== this._activeDraggables[0];\n        if (reversed) {\n            const lastItemRect = itemPositions[itemPositions.length - 1].clientRect;\n            return isHorizontal ? pointerX >= lastItemRect.right : pointerY >= lastItemRect.bottom;\n        }\n        else {\n            const firstItemRect = itemPositions[0].clientRect;\n            return isHorizontal ? pointerX <= firstItemRect.left : pointerY <= firstItemRect.top;\n        }\n    }\n    /**\n     * Gets the index of an item in the drop container, based on the position of the user's pointer.\n     * @param item Item that is being sorted.\n     * @param pointerX Position of the user's pointer along the X axis.\n     * @param pointerY Position of the user's pointer along the Y axis.\n     * @param delta Direction in which the user is moving their pointer.\n     */\n    _getItemIndexFromPointerPosition(item, pointerX, pointerY, delta) {\n        const isHorizontal = this._orientation === 'horizontal';\n        const index = findIndex(this._itemPositions, ({ drag, clientRect }, _, array) => {\n            if (drag === item) {\n                // If there's only one item left in the container, it must be\n                // the dragged item itself so we use it as a reference.\n                return array.length < 2;\n            }\n            if (delta) {\n                const direction = isHorizontal ? delta.x : delta.y;\n                // If the user is still hovering over the same item as last time, their cursor hasn't left\n                // the item after we made the swap, and they didn't change the direction in which they're\n                // dragging, we don't consider it a direction swap.\n                if (drag === this._previousSwap.drag && this._previousSwap.overlaps &&\n                    direction === this._previousSwap.delta) {\n                    return false;\n                }\n            }\n            return isHorizontal ?\n                // Round these down since most browsers report client rects with\n                // sub-pixel precision, whereas the pointer coordinates are rounded to pixels.\n                pointerX >= Math.floor(clientRect.left) && pointerX < Math.floor(clientRect.right) :\n                pointerY >= Math.floor(clientRect.top) && pointerY < Math.floor(clientRect.bottom);\n        });\n        return (index === -1 || !this.sortPredicate(index, item, this)) ? -1 : index;\n    }\n    /** Caches the current items in the list and their positions. */\n    _cacheItems() {\n        this._activeDraggables = this._draggables.slice();\n        this._cacheItemPositions();\n        this._cacheParentPositions();\n    }\n    /**\n     * Checks whether the user's pointer is positioned over the container.\n     * @param x Pointer position along the X axis.\n     * @param y Pointer position along the Y axis.\n     */\n    _isOverContainer(x, y) {\n        return this._clientRect != null && isInsideClientRect(this._clientRect, x, y);\n    }\n    /**\n     * Figures out whether an item should be moved into a sibling\n     * drop container, based on its current position.\n     * @param item Drag item that is being moved.\n     * @param x Position of the item along the X axis.\n     * @param y Position of the item along the Y axis.\n     */\n    _getSiblingContainerFromPosition(item, x, y) {\n        return this._siblings.find(sibling => sibling._canReceive(item, x, y));\n    }\n    /**\n     * Checks whether the drop list can receive the passed-in item.\n     * @param item Item that is being dragged into the list.\n     * @param x Position of the item along the X axis.\n     * @param y Position of the item along the Y axis.\n     */\n    _canReceive(item, x, y) {\n        if (!this._clientRect || !isInsideClientRect(this._clientRect, x, y) ||\n            !this.enterPredicate(item, this)) {\n            return false;\n        }\n        const elementFromPoint = this._getShadowRoot().elementFromPoint(x, y);\n        // If there's no element at the pointer position, then\n        // the client rect is probably scrolled out of the view.\n        if (!elementFromPoint) {\n            return false;\n        }\n        const nativeElement = coerceElement(this.element);\n        // The `ClientRect`, that we're using to find the container over which the user is\n        // hovering, doesn't give us any information on whether the element has been scrolled\n        // out of the view or whether it's overlapping with other containers. This means that\n        // we could end up transferring the item into a container that's invisible or is positioned\n        // below another one. We use the result from `elementFromPoint` to get the top-most element\n        // at the pointer position and to find whether it's one of the intersecting drop containers.\n        return elementFromPoint === nativeElement || nativeElement.contains(elementFromPoint);\n    }\n    /**\n     * Called by one of the connected drop lists when a dragging sequence has started.\n     * @param sibling Sibling in which dragging has started.\n     */\n    _startReceiving(sibling, items) {\n        const activeSiblings = this._activeSiblings;\n        if (!activeSiblings.has(sibling) && items.every(item => {\n            // Note that we have to add an exception to the `enterPredicate` for items that started off\n            // in this drop list. The drag ref has logic that allows an item to return to its initial\n            // container, if it has left the initial container and none of the connected containers\n            // allow it to enter. See `DragRef._updateActiveDropContainer` for more context.\n            return this.enterPredicate(item, this) || this._draggables.indexOf(item) > -1;\n        })) {\n            activeSiblings.add(sibling);\n            this._cacheParentPositions();\n            this._listenToScrollEvents();\n        }\n    }\n    /**\n     * Called by a connected drop list when dragging has stopped.\n     * @param sibling Sibling whose dragging has stopped.\n     */\n    _stopReceiving(sibling) {\n        this._activeSiblings.delete(sibling);\n        this._viewportScrollSubscription.unsubscribe();\n    }\n    /**\n     * Starts listening to scroll events on the viewport.\n     * Used for updating the internal state of the list.\n     */\n    _listenToScrollEvents() {\n        this._viewportScrollSubscription = this._dragDropRegistry.scroll.subscribe(event => {\n            if (this.isDragging()) {\n                const scrollDifference = this._parentPositions.handleScroll(event);\n                if (scrollDifference) {\n                    // Since we know the amount that the user has scrolled we can shift all of the\n                    // client rectangles ourselves. This is cheaper than re-measuring everything and\n                    // we can avoid inconsistent behavior where we might be measuring the element before\n                    // its position has changed.\n                    this._itemPositions.forEach(({ clientRect }) => {\n                        adjustClientRect(clientRect, scrollDifference.top, scrollDifference.left);\n                    });\n                    // We need two loops for this, because we want all of the cached\n                    // positions to be up-to-date before we re-sort the item.\n                    this._itemPositions.forEach(({ drag }) => {\n                        if (this._dragDropRegistry.isDragging(drag)) {\n                            // We need to re-sort the item manually, because the pointer move\n                            // events won't be dispatched while the user is scrolling.\n                            drag._sortFromLastPointerPosition();\n                        }\n                    });\n                }\n            }\n            else if (this.isReceiving()) {\n                this._cacheParentPositions();\n            }\n        });\n    }\n    /**\n     * Lazily resolves and returns the shadow root of the element. We do this in a function, rather\n     * than saving it in property directly on init, because we want to resolve it as late as possible\n     * in order to ensure that the element has been moved into the shadow DOM. Doing it inside the\n     * constructor might be too early if the element is inside of something like `ngFor` or `ngIf`.\n     */\n    _getShadowRoot() {\n        if (!this._cachedShadowRoot) {\n            const shadowRoot = _getShadowRoot(coerceElement(this.element));\n            this._cachedShadowRoot = shadowRoot || this._document;\n        }\n        return this._cachedShadowRoot;\n    }\n    /** Notifies any siblings that may potentially receive the item. */\n    _notifyReceivingSiblings() {\n        const draggedItems = this._activeDraggables.filter(item => item.isDragging());\n        this._siblings.forEach(sibling => sibling._startReceiving(this, draggedItems));\n    }\n}\n/**\n * Finds the index of an item that matches a predicate function. Used as an equivalent\n * of `Array.prototype.findIndex` which isn't part of the standard Google typings.\n * @param array Array in which to look for matches.\n * @param predicate Function used to determine whether an item is a match.\n */\nfunction findIndex(array, predicate) {\n    for (let i = 0; i < array.length; i++) {\n        if (predicate(array[i], i, array)) {\n            return i;\n        }\n    }\n    return -1;\n}\n/**\n * Increments the vertical scroll position of a node.\n * @param node Node whose scroll position should change.\n * @param amount Amount of pixels that the `node` should be scrolled.\n */\nfunction incrementVerticalScroll(node, amount) {\n    if (node === window) {\n        node.scrollBy(0, amount);\n    }\n    else {\n        // Ideally we could use `Element.scrollBy` here as well, but IE and Edge don't support it.\n        node.scrollTop += amount;\n    }\n}\n/**\n * Increments the horizontal scroll position of a node.\n * @param node Node whose scroll position should change.\n * @param amount Amount of pixels that the `node` should be scrolled.\n */\nfunction incrementHorizontalScroll(node, amount) {\n    if (node === window) {\n        node.scrollBy(amount, 0);\n    }\n    else {\n        // Ideally we could use `Element.scrollBy` here as well, but IE and Edge don't support it.\n        node.scrollLeft += amount;\n    }\n}\n/**\n * Gets whether the vertical auto-scroll direction of a node.\n * @param clientRect Dimensions of the node.\n * @param pointerY Position of the user's pointer along the y axis.\n */\nfunction getVerticalScrollDirection(clientRect, pointerY) {\n    const { top, bottom, height } = clientRect;\n    const yThreshold = height * SCROLL_PROXIMITY_THRESHOLD;\n    if (pointerY >= top - yThreshold && pointerY <= top + yThreshold) {\n        return 1 /* UP */;\n    }\n    else if (pointerY >= bottom - yThreshold && pointerY <= bottom + yThreshold) {\n        return 2 /* DOWN */;\n    }\n    return 0 /* NONE */;\n}\n/**\n * Gets whether the horizontal auto-scroll direction of a node.\n * @param clientRect Dimensions of the node.\n * @param pointerX Position of the user's pointer along the x axis.\n */\nfunction getHorizontalScrollDirection(clientRect, pointerX) {\n    const { left, right, width } = clientRect;\n    const xThreshold = width * SCROLL_PROXIMITY_THRESHOLD;\n    if (pointerX >= left - xThreshold && pointerX <= left + xThreshold) {\n        return 1 /* LEFT */;\n    }\n    else if (pointerX >= right - xThreshold && pointerX <= right + xThreshold) {\n        return 2 /* RIGHT */;\n    }\n    return 0 /* NONE */;\n}\n/**\n * Gets the directions in which an element node should be scrolled,\n * assuming that the user's pointer is already within it scrollable region.\n * @param element Element for which we should calculate the scroll direction.\n * @param clientRect Bounding client rectangle of the element.\n * @param pointerX Position of the user's pointer along the x axis.\n * @param pointerY Position of the user's pointer along the y axis.\n */\nfunction getElementScrollDirections(element, clientRect, pointerX, pointerY) {\n    const computedVertical = getVerticalScrollDirection(clientRect, pointerY);\n    const computedHorizontal = getHorizontalScrollDirection(clientRect, pointerX);\n    let verticalScrollDirection = 0 /* NONE */;\n    let horizontalScrollDirection = 0 /* NONE */;\n    // Note that we here we do some extra checks for whether the element is actually scrollable in\n    // a certain direction and we only assign the scroll direction if it is. We do this so that we\n    // can allow other elements to be scrolled, if the current element can't be scrolled anymore.\n    // This allows us to handle cases where the scroll regions of two scrollable elements overlap.\n    if (computedVertical) {\n        const scrollTop = element.scrollTop;\n        if (computedVertical === 1 /* UP */) {\n            if (scrollTop > 0) {\n                verticalScrollDirection = 1 /* UP */;\n            }\n        }\n        else if (element.scrollHeight - scrollTop > element.clientHeight) {\n            verticalScrollDirection = 2 /* DOWN */;\n        }\n    }\n    if (computedHorizontal) {\n        const scrollLeft = element.scrollLeft;\n        if (computedHorizontal === 1 /* LEFT */) {\n            if (scrollLeft > 0) {\n                horizontalScrollDirection = 1 /* LEFT */;\n            }\n        }\n        else if (element.scrollWidth - scrollLeft > element.clientWidth) {\n            horizontalScrollDirection = 2 /* RIGHT */;\n        }\n    }\n    return [verticalScrollDirection, horizontalScrollDirection];\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/** Event options that can be used to bind an active, capturing event. */\nconst activeCapturingEventOptions = normalizePassiveListenerOptions({\n    passive: false,\n    capture: true\n});\n/**\n * Service that keeps track of all the drag item and drop container\n * instances, and manages global event listeners on the `document`.\n * @docs-private\n */\n// Note: this class is generic, rather than referencing CdkDrag and CdkDropList directly, in order\n// to avoid circular imports. If we were to reference them here, importing the registry into the\n// classes that are registering themselves will introduce a circular import.\nclass DragDropRegistry {\n    constructor(_ngZone, _document) {\n        this._ngZone = _ngZone;\n        /** Registered drop container instances. */\n        this._dropInstances = new Set();\n        /** Registered drag item instances. */\n        this._dragInstances = new Set();\n        /** Drag item instances that are currently being dragged. */\n        this._activeDragInstances = [];\n        /** Keeps track of the event listeners that we've bound to the `document`. */\n        this._globalListeners = new Map();\n        /**\n         * Predicate function to check if an item is being dragged.  Moved out into a property,\n         * because it'll be called a lot and we don't want to create a new function every time.\n         */\n        this._draggingPredicate = (item) => item.isDragging();\n        /**\n         * Emits the `touchmove` or `mousemove` events that are dispatched\n         * while the user is dragging a drag item instance.\n         */\n        this.pointerMove = new Subject();\n        /**\n         * Emits the `touchend` or `mouseup` events that are dispatched\n         * while the user is dragging a drag item instance.\n         */\n        this.pointerUp = new Subject();\n        /** Emits when the viewport has been scrolled while the user is dragging an item. */\n        this.scroll = new Subject();\n        /**\n         * Event listener that will prevent the default browser action while the user is dragging.\n         * @param event Event whose default action should be prevented.\n         */\n        this._preventDefaultWhileDragging = (event) => {\n            if (this._activeDragInstances.length > 0) {\n                event.preventDefault();\n            }\n        };\n        /** Event listener for `touchmove` that is bound even if no dragging is happening. */\n        this._persistentTouchmoveListener = (event) => {\n            if (this._activeDragInstances.length > 0) {\n                // Note that we only want to prevent the default action after dragging has actually started.\n                // Usually this is the same time at which the item is added to the `_activeDragInstances`,\n                // but it could be pushed back if the user has set up a drag delay or threshold.\n                if (this._activeDragInstances.some(this._draggingPredicate)) {\n                    event.preventDefault();\n                }\n                this.pointerMove.next(event);\n            }\n        };\n        this._document = _document;\n    }\n    /** Adds a drop container to the registry. */\n    registerDropContainer(drop) {\n        if (!this._dropInstances.has(drop)) {\n            this._dropInstances.add(drop);\n        }\n    }\n    /** Adds a drag item instance to the registry. */\n    registerDragItem(drag) {\n        this._dragInstances.add(drag);\n        // The `touchmove` event gets bound once, ahead of time, because WebKit\n        // won't preventDefault on a dynamically-added `touchmove` listener.\n        // See https://bugs.webkit.org/show_bug.cgi?id=184250.\n        if (this._dragInstances.size === 1) {\n            this._ngZone.runOutsideAngular(() => {\n                // The event handler has to be explicitly active,\n                // because newer browsers make it passive by default.\n                this._document.addEventListener('touchmove', this._persistentTouchmoveListener, activeCapturingEventOptions);\n            });\n        }\n    }\n    /** Removes a drop container from the registry. */\n    removeDropContainer(drop) {\n        this._dropInstances.delete(drop);\n    }\n    /** Removes a drag item instance from the registry. */\n    removeDragItem(drag) {\n        this._dragInstances.delete(drag);\n        this.stopDragging(drag);\n        if (this._dragInstances.size === 0) {\n            this._document.removeEventListener('touchmove', this._persistentTouchmoveListener, activeCapturingEventOptions);\n        }\n    }\n    /**\n     * Starts the dragging sequence for a drag instance.\n     * @param drag Drag instance which is being dragged.\n     * @param event Event that initiated the dragging.\n     */\n    startDragging(drag, event) {\n        // Do not process the same drag twice to avoid memory leaks and redundant listeners\n        if (this._activeDragInstances.indexOf(drag) > -1) {\n            return;\n        }\n        this._activeDragInstances.push(drag);\n        if (this._activeDragInstances.length === 1) {\n            const isTouchEvent = event.type.startsWith('touch');\n            // We explicitly bind __active__ listeners here, because newer browsers will default to\n            // passive ones for `mousemove` and `touchmove`. The events need to be active, because we\n            // use `preventDefault` to prevent the page from scrolling while the user is dragging.\n            this._globalListeners\n                .set(isTouchEvent ? 'touchend' : 'mouseup', {\n                handler: (e) => this.pointerUp.next(e),\n                options: true\n            })\n                .set('scroll', {\n                handler: (e) => this.scroll.next(e),\n                // Use capturing so that we pick up scroll changes in any scrollable nodes that aren't\n                // the document. See https://github.com/angular/components/issues/17144.\n                options: true\n            })\n                // Preventing the default action on `mousemove` isn't enough to disable text selection\n                // on Safari so we need to prevent the selection event as well. Alternatively this can\n                // be done by setting `user-select: none` on the `body`, however it has causes a style\n                // recalculation which can be expensive on pages with a lot of elements.\n                .set('selectstart', {\n                handler: this._preventDefaultWhileDragging,\n                options: activeCapturingEventOptions\n            });\n            // We don't have to bind a move event for touch drag sequences, because\n            // we already have a persistent global one bound from `registerDragItem`.\n            if (!isTouchEvent) {\n                this._globalListeners.set('mousemove', {\n                    handler: (e) => this.pointerMove.next(e),\n                    options: activeCapturingEventOptions\n                });\n            }\n            this._ngZone.runOutsideAngular(() => {\n                this._globalListeners.forEach((config, name) => {\n                    this._document.addEventListener(name, config.handler, config.options);\n                });\n            });\n        }\n    }\n    /** Stops dragging a drag item instance. */\n    stopDragging(drag) {\n        const index = this._activeDragInstances.indexOf(drag);\n        if (index > -1) {\n            this._activeDragInstances.splice(index, 1);\n            if (this._activeDragInstances.length === 0) {\n                this._clearGlobalListeners();\n            }\n        }\n    }\n    /** Gets whether a drag item instance is currently being dragged. */\n    isDragging(drag) {\n        return this._activeDragInstances.indexOf(drag) > -1;\n    }\n    ngOnDestroy() {\n        this._dragInstances.forEach(instance => this.removeDragItem(instance));\n        this._dropInstances.forEach(instance => this.removeDropContainer(instance));\n        this._clearGlobalListeners();\n        this.pointerMove.complete();\n        this.pointerUp.complete();\n    }\n    /** Clears out the global event listeners from the `document`. */\n    _clearGlobalListeners() {\n        this._globalListeners.forEach((config, name) => {\n            this._document.removeEventListener(name, config.handler, config.options);\n        });\n        this._globalListeners.clear();\n    }\n}\nDragDropRegistry.ɵfac = function DragDropRegistry_Factory(t) { return new (t || DragDropRegistry)(ɵngcc0.ɵɵinject(ɵngcc0.NgZone), ɵngcc0.ɵɵinject(DOCUMENT)); };\nDragDropRegistry.ɵprov = ɵɵdefineInjectable({ factory: function DragDropRegistry_Factory() { return new DragDropRegistry(ɵɵinject(NgZone), ɵɵinject(DOCUMENT)); }, token: DragDropRegistry, providedIn: \"root\" });\nDragDropRegistry.ctorParameters = () => [\n    { type: NgZone },\n    { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(DragDropRegistry, [{\n        type: Injectable,\n        args: [{ providedIn: 'root' }]\n    }], function () { return [{ type: ɵngcc0.NgZone }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [DOCUMENT]\n            }] }]; }, null); })();\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/** Default configuration to be used when creating a `DragRef`. */\nconst DEFAULT_CONFIG = {\n    dragStartThreshold: 5,\n    pointerDirectionChangeThreshold: 5\n};\n/**\n * Service that allows for drag-and-drop functionality to be attached to DOM elements.\n */\nclass DragDrop {\n    constructor(_document, _ngZone, _viewportRuler, _dragDropRegistry) {\n        this._document = _document;\n        this._ngZone = _ngZone;\n        this._viewportRuler = _viewportRuler;\n        this._dragDropRegistry = _dragDropRegistry;\n    }\n    /**\n     * Turns an element into a draggable item.\n     * @param element Element to which to attach the dragging functionality.\n     * @param config Object used to configure the dragging behavior.\n     */\n    createDrag(element, config = DEFAULT_CONFIG) {\n        return new DragRef(element, config, this._document, this._ngZone, this._viewportRuler, this._dragDropRegistry);\n    }\n    /**\n     * Turns an element into a drop list.\n     * @param element Element to which to attach the drop list functionality.\n     */\n    createDropList(element) {\n        return new DropListRef(element, this._dragDropRegistry, this._document, this._ngZone, this._viewportRuler);\n    }\n}\nDragDrop.ɵfac = function DragDrop_Factory(t) { return new (t || DragDrop)(ɵngcc0.ɵɵinject(DOCUMENT), ɵngcc0.ɵɵinject(ɵngcc0.NgZone), ɵngcc0.ɵɵinject(ɵngcc1.ViewportRuler), ɵngcc0.ɵɵinject(DragDropRegistry)); };\nDragDrop.ɵprov = ɵɵdefineInjectable({ factory: function DragDrop_Factory() { return new DragDrop(ɵɵinject(DOCUMENT), ɵɵinject(NgZone), ɵɵinject(ViewportRuler), ɵɵinject(DragDropRegistry)); }, token: DragDrop, providedIn: \"root\" });\nDragDrop.ctorParameters = () => [\n    { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n    { type: NgZone },\n    { type: ViewportRuler },\n    { type: DragDropRegistry }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(DragDrop, [{\n        type: Injectable,\n        args: [{ providedIn: 'root' }]\n    }], function () { return [{ type: undefined, decorators: [{\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: ɵngcc0.NgZone }, { type: ɵngcc1.ViewportRuler }, { type: DragDropRegistry }]; }, null); })();\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 for a `CdkDrag` to provide itself as a parent to the\n * drag-specific child directive (`CdkDragHandle`, `CdkDragPreview` etc.). Used primarily\n * to avoid circular imports.\n * @docs-private\n */\nconst CDK_DRAG_PARENT = new InjectionToken('CDK_DRAG_PARENT');\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 * Injection token that can be used to reference instances of `CdkDropListGroup`. It serves as\n * alternative token to the actual `CdkDropListGroup` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst CDK_DROP_LIST_GROUP = new InjectionToken('CdkDropListGroup');\n/**\n * Declaratively connects sibling `cdkDropList` instances together. All of the `cdkDropList`\n * elements that are placed inside a `cdkDropListGroup` will be connected to each other\n * automatically. Can be used as an alternative to the `cdkDropListConnectedTo` input\n * from `cdkDropList`.\n */\nclass CdkDropListGroup {\n    constructor() {\n        /** Drop lists registered inside the group. */\n        this._items = new Set();\n        this._disabled = false;\n    }\n    /** Whether starting a dragging sequence from inside this group is disabled. */\n    get disabled() { return this._disabled; }\n    set disabled(value) {\n        this._disabled = coerceBooleanProperty(value);\n    }\n    ngOnDestroy() {\n        this._items.clear();\n    }\n}\nCdkDropListGroup.ɵfac = function CdkDropListGroup_Factory(t) { return new (t || CdkDropListGroup)(); };\nCdkDropListGroup.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkDropListGroup, selectors: [[\"\", \"cdkDropListGroup\", \"\"]], inputs: { disabled: [\"cdkDropListGroupDisabled\", \"disabled\"] }, exportAs: [\"cdkDropListGroup\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CDK_DROP_LIST_GROUP, useExisting: CdkDropListGroup }])] });\nCdkDropListGroup.propDecorators = {\n    disabled: [{ type: Input, args: ['cdkDropListGroupDisabled',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkDropListGroup, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkDropListGroup]',\n                exportAs: 'cdkDropListGroup',\n                providers: [{ provide: CDK_DROP_LIST_GROUP, useExisting: CdkDropListGroup }]\n            }]\n    }], function () { return []; }, { disabled: [{\n            type: Input,\n            args: ['cdkDropListGroupDisabled']\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 configure the\n * behavior of the drag&drop-related components.\n */\nconst CDK_DRAG_CONFIG = new InjectionToken('CDK_DRAG_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/**\n * Asserts that a particular node is an element.\n * @param node Node to be checked.\n * @param name Name to attach to the error message.\n */\nfunction assertElementNode(node, name) {\n    if (node.nodeType !== 1) {\n        throw Error(`${name} must be attached to an element node. ` +\n            `Currently attached to \"${node.nodeName}\".`);\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/** Counter used to generate unique ids for drop zones. */\nlet _uniqueIdCounter = 0;\n/**\n * Injection token that can be used to reference instances of `CdkDropList`. It serves as\n * alternative token to the actual `CdkDropList` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst CDK_DROP_LIST = new InjectionToken('CdkDropList');\nconst ɵ0 = undefined;\n/** Container that wraps a set of draggable items. */\nclass CdkDropList {\n    constructor(\n    /** Element that the drop list is attached to. */\n    element, dragDrop, _changeDetectorRef, _scrollDispatcher, _dir, _group, config) {\n        this.element = element;\n        this._changeDetectorRef = _changeDetectorRef;\n        this._scrollDispatcher = _scrollDispatcher;\n        this._dir = _dir;\n        this._group = _group;\n        /** Emits when the list has been destroyed. */\n        this._destroyed = new Subject();\n        /**\n         * Other draggable containers that this container is connected to and into which the\n         * container's items can be transferred. Can either be references to other drop containers,\n         * or their unique IDs.\n         */\n        this.connectedTo = [];\n        /**\n         * Unique ID for the drop zone. Can be used as a reference\n         * in the `connectedTo` of another `CdkDropList`.\n         */\n        this.id = `cdk-drop-list-${_uniqueIdCounter++}`;\n        /**\n         * Function that is used to determine whether an item\n         * is allowed to be moved into a drop container.\n         */\n        this.enterPredicate = () => true;\n        /** Functions that is used to determine whether an item can be sorted into a particular index. */\n        this.sortPredicate = () => true;\n        /** Emits when the user drops an item inside the container. */\n        this.dropped = new EventEmitter();\n        /**\n         * Emits when the user has moved a new drag item into this container.\n         */\n        this.entered = new EventEmitter();\n        /**\n         * Emits when the user removes an item from the container\n         * by dragging it into another container.\n         */\n        this.exited = new EventEmitter();\n        /** Emits as the user is swapping items while actively dragging. */\n        this.sorted = new EventEmitter();\n        /**\n         * Keeps track of the items that are registered with this container. Historically we used to\n         * do this with a `ContentChildren` query, however queries don't handle transplanted views very\n         * well which means that we can't handle cases like dragging the headers of a `mat-table`\n         * correctly. What we do instead is to have the items register themselves with the container\n         * and then we sort them based on their position in the DOM.\n         */\n        this._unsortedItems = new Set();\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n            assertElementNode(element.nativeElement, 'cdkDropList');\n        }\n        this._dropListRef = dragDrop.createDropList(element);\n        this._dropListRef.data = this;\n        if (config) {\n            this._assignDefaults(config);\n        }\n        this._dropListRef.enterPredicate = (drag, drop) => {\n            return this.enterPredicate(drag.data, drop.data);\n        };\n        this._dropListRef.sortPredicate =\n            (index, drag, drop) => {\n                return this.sortPredicate(index, drag.data, drop.data);\n            };\n        this._setupInputSyncSubscription(this._dropListRef);\n        this._handleEvents(this._dropListRef);\n        CdkDropList._dropLists.push(this);\n        if (_group) {\n            _group._items.add(this);\n        }\n    }\n    /** Whether starting a dragging sequence from this container is disabled. */\n    get disabled() {\n        return this._disabled || (!!this._group && this._group.disabled);\n    }\n    set disabled(value) {\n        // Usually we sync the directive and ref state right before dragging starts, in order to have\n        // a single point of failure and to avoid having to use setters for everything. `disabled` is\n        // a special case, because it can prevent the `beforeStarted` event from firing, which can lock\n        // the user in a disabled state, so we also need to sync it as it's being set.\n        this._dropListRef.disabled = this._disabled = coerceBooleanProperty(value);\n    }\n    /** Registers an items with the drop list. */\n    addItem(item) {\n        this._unsortedItems.add(item);\n        if (this._dropListRef.isDragging()) {\n            this._syncItemsWithRef();\n        }\n    }\n    /** Removes an item from the drop list. */\n    removeItem(item) {\n        this._unsortedItems.delete(item);\n        if (this._dropListRef.isDragging()) {\n            this._syncItemsWithRef();\n        }\n    }\n    /** Gets the registered items in the list, sorted by their position in the DOM. */\n    getSortedItems() {\n        return Array.from(this._unsortedItems).sort((a, b) => {\n            const documentPosition = a._dragRef.getVisibleElement().compareDocumentPosition(b._dragRef.getVisibleElement());\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    }\n    ngOnDestroy() {\n        const index = CdkDropList._dropLists.indexOf(this);\n        if (index > -1) {\n            CdkDropList._dropLists.splice(index, 1);\n        }\n        if (this._group) {\n            this._group._items.delete(this);\n        }\n        this._unsortedItems.clear();\n        this._dropListRef.dispose();\n        this._destroyed.next();\n        this._destroyed.complete();\n    }\n    /** Syncs the inputs of the CdkDropList with the options of the underlying DropListRef. */\n    _setupInputSyncSubscription(ref) {\n        if (this._dir) {\n            this._dir.change\n                .pipe(startWith(this._dir.value), takeUntil(this._destroyed))\n                .subscribe(value => ref.withDirection(value));\n        }\n        ref.beforeStarted.subscribe(() => {\n            const siblings = coerceArray(this.connectedTo).map(drop => {\n                if (typeof drop === 'string') {\n                    const correspondingDropList = CdkDropList._dropLists.find(list => list.id === drop);\n                    if (!correspondingDropList && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n                        console.warn(`CdkDropList could not find connected drop list with id \"${drop}\"`);\n                    }\n                    return correspondingDropList;\n                }\n                return drop;\n            });\n            if (this._group) {\n                this._group._items.forEach(drop => {\n                    if (siblings.indexOf(drop) === -1) {\n                        siblings.push(drop);\n                    }\n                });\n            }\n            // Note that we resolve the scrollable parents here so that we delay the resolution\n            // as long as possible, ensuring that the element is in its final place in the DOM.\n            if (!this._scrollableParentsResolved) {\n                const scrollableParents = this._scrollDispatcher\n                    .getAncestorScrollContainers(this.element)\n                    .map(scrollable => scrollable.getElementRef().nativeElement);\n                this._dropListRef.withScrollableParents(scrollableParents);\n                // Only do this once since it involves traversing the DOM and the parents\n                // shouldn't be able to change without the drop list being destroyed.\n                this._scrollableParentsResolved = true;\n            }\n            ref.disabled = this.disabled;\n            ref.lockAxis = this.lockAxis;\n            ref.sortingDisabled = coerceBooleanProperty(this.sortingDisabled);\n            ref.autoScrollDisabled = coerceBooleanProperty(this.autoScrollDisabled);\n            ref.autoScrollStep = coerceNumberProperty(this.autoScrollStep, 2);\n            ref\n                .connectedTo(siblings.filter(drop => drop && drop !== this).map(list => list._dropListRef))\n                .withOrientation(this.orientation);\n        });\n    }\n    /** Handles events from the underlying DropListRef. */\n    _handleEvents(ref) {\n        ref.beforeStarted.subscribe(() => {\n            this._syncItemsWithRef();\n            this._changeDetectorRef.markForCheck();\n        });\n        ref.entered.subscribe(event => {\n            this.entered.emit({\n                container: this,\n                item: event.item.data,\n                currentIndex: event.currentIndex\n            });\n        });\n        ref.exited.subscribe(event => {\n            this.exited.emit({\n                container: this,\n                item: event.item.data\n            });\n            this._changeDetectorRef.markForCheck();\n        });\n        ref.sorted.subscribe(event => {\n            this.sorted.emit({\n                previousIndex: event.previousIndex,\n                currentIndex: event.currentIndex,\n                container: this,\n                item: event.item.data\n            });\n        });\n        ref.dropped.subscribe(event => {\n            this.dropped.emit({\n                previousIndex: event.previousIndex,\n                currentIndex: event.currentIndex,\n                previousContainer: event.previousContainer.data,\n                container: event.container.data,\n                item: event.item.data,\n                isPointerOverContainer: event.isPointerOverContainer,\n                distance: event.distance\n            });\n            // Mark for check since all of these events run outside of change\n            // detection and we're not guaranteed for something else to have triggered it.\n            this._changeDetectorRef.markForCheck();\n        });\n    }\n    /** Assigns the default input values based on a provided config object. */\n    _assignDefaults(config) {\n        const { lockAxis, draggingDisabled, sortingDisabled, listAutoScrollDisabled, listOrientation } = config;\n        this.disabled = draggingDisabled == null ? false : draggingDisabled;\n        this.sortingDisabled = sortingDisabled == null ? false : sortingDisabled;\n        this.autoScrollDisabled = listAutoScrollDisabled == null ? false : listAutoScrollDisabled;\n        this.orientation = listOrientation || 'vertical';\n        if (lockAxis) {\n            this.lockAxis = lockAxis;\n        }\n    }\n    /** Syncs up the registered drag items with underlying drop list ref. */\n    _syncItemsWithRef() {\n        this._dropListRef.withItems(this.getSortedItems().map(item => item._dragRef));\n    }\n}\nCdkDropList.ɵfac = function CdkDropList_Factory(t) { return new (t || CdkDropList)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(DragDrop), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ScrollDispatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(CDK_DROP_LIST_GROUP, 12), ɵngcc0.ɵɵdirectiveInject(CDK_DRAG_CONFIG, 8)); };\nCdkDropList.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkDropList, selectors: [[\"\", \"cdkDropList\", \"\"], [\"cdk-drop-list\"]], hostAttrs: [1, \"cdk-drop-list\"], hostVars: 7, hostBindings: function CdkDropList_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"id\", ctx.id);\n        ɵngcc0.ɵɵclassProp(\"cdk-drop-list-disabled\", ctx.disabled)(\"cdk-drop-list-dragging\", ctx._dropListRef.isDragging())(\"cdk-drop-list-receiving\", ctx._dropListRef.isReceiving());\n    } }, inputs: { connectedTo: [\"cdkDropListConnectedTo\", \"connectedTo\"], id: \"id\", enterPredicate: [\"cdkDropListEnterPredicate\", \"enterPredicate\"], sortPredicate: [\"cdkDropListSortPredicate\", \"sortPredicate\"], disabled: [\"cdkDropListDisabled\", \"disabled\"], sortingDisabled: [\"cdkDropListSortingDisabled\", \"sortingDisabled\"], autoScrollDisabled: [\"cdkDropListAutoScrollDisabled\", \"autoScrollDisabled\"], orientation: [\"cdkDropListOrientation\", \"orientation\"], lockAxis: [\"cdkDropListLockAxis\", \"lockAxis\"], data: [\"cdkDropListData\", \"data\"], autoScrollStep: [\"cdkDropListAutoScrollStep\", \"autoScrollStep\"] }, outputs: { dropped: \"cdkDropListDropped\", entered: \"cdkDropListEntered\", exited: \"cdkDropListExited\", sorted: \"cdkDropListSorted\" }, exportAs: [\"cdkDropList\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            // Prevent child drop lists from picking up the same group as their parent.\n            { provide: CDK_DROP_LIST_GROUP, useValue: ɵ0 },\n            { provide: CDK_DROP_LIST, useExisting: CdkDropList },\n        ])] });\n/** Keeps track of the drop lists that are currently on the page. */\nCdkDropList._dropLists = [];\nCdkDropList.ctorParameters = () => [\n    { type: ElementRef },\n    { type: DragDrop },\n    { type: ChangeDetectorRef },\n    { type: ScrollDispatcher },\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: CdkDropListGroup, decorators: [{ type: Optional }, { type: Inject, args: [CDK_DROP_LIST_GROUP,] }, { type: SkipSelf }] },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CDK_DRAG_CONFIG,] }] }\n];\nCdkDropList.propDecorators = {\n    connectedTo: [{ type: Input, args: ['cdkDropListConnectedTo',] }],\n    data: [{ type: Input, args: ['cdkDropListData',] }],\n    orientation: [{ type: Input, args: ['cdkDropListOrientation',] }],\n    id: [{ type: Input }],\n    lockAxis: [{ type: Input, args: ['cdkDropListLockAxis',] }],\n    disabled: [{ type: Input, args: ['cdkDropListDisabled',] }],\n    sortingDisabled: [{ type: Input, args: ['cdkDropListSortingDisabled',] }],\n    enterPredicate: [{ type: Input, args: ['cdkDropListEnterPredicate',] }],\n    sortPredicate: [{ type: Input, args: ['cdkDropListSortPredicate',] }],\n    autoScrollDisabled: [{ type: Input, args: ['cdkDropListAutoScrollDisabled',] }],\n    autoScrollStep: [{ type: Input, args: ['cdkDropListAutoScrollStep',] }],\n    dropped: [{ type: Output, args: ['cdkDropListDropped',] }],\n    entered: [{ type: Output, args: ['cdkDropListEntered',] }],\n    exited: [{ type: Output, args: ['cdkDropListExited',] }],\n    sorted: [{ type: Output, args: ['cdkDropListSorted',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkDropList, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkDropList], cdk-drop-list',\n                exportAs: 'cdkDropList',\n                providers: [\n                    // Prevent child drop lists from picking up the same group as their parent.\n                    { provide: CDK_DROP_LIST_GROUP, useValue: ɵ0 },\n                    { provide: CDK_DROP_LIST, useExisting: CdkDropList },\n                ],\n                host: {\n                    'class': 'cdk-drop-list',\n                    '[attr.id]': 'id',\n                    '[class.cdk-drop-list-disabled]': 'disabled',\n                    '[class.cdk-drop-list-dragging]': '_dropListRef.isDragging()',\n                    '[class.cdk-drop-list-receiving]': '_dropListRef.isReceiving()'\n                }\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: DragDrop }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.ScrollDispatcher }, { type: ɵngcc2.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: CdkDropListGroup, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [CDK_DROP_LIST_GROUP]\n            }, {\n                type: SkipSelf\n            }] }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [CDK_DRAG_CONFIG]\n            }] }]; }, { connectedTo: [{\n            type: Input,\n            args: ['cdkDropListConnectedTo']\n        }], id: [{\n            type: Input\n        }], enterPredicate: [{\n            type: Input,\n            args: ['cdkDropListEnterPredicate']\n        }], sortPredicate: [{\n            type: Input,\n            args: ['cdkDropListSortPredicate']\n        }], dropped: [{\n            type: Output,\n            args: ['cdkDropListDropped']\n        }], entered: [{\n            type: Output,\n            args: ['cdkDropListEntered']\n        }], exited: [{\n            type: Output,\n            args: ['cdkDropListExited']\n        }], sorted: [{\n            type: Output,\n            args: ['cdkDropListSorted']\n        }], disabled: [{\n            type: Input,\n            args: ['cdkDropListDisabled']\n        }], sortingDisabled: [{\n            type: Input,\n            args: ['cdkDropListSortingDisabled']\n        }], autoScrollDisabled: [{\n            type: Input,\n            args: ['cdkDropListAutoScrollDisabled']\n        }], orientation: [{\n            type: Input,\n            args: ['cdkDropListOrientation']\n        }], lockAxis: [{\n            type: Input,\n            args: ['cdkDropListLockAxis']\n        }], data: [{\n            type: Input,\n            args: ['cdkDropListData']\n        }], autoScrollStep: [{\n            type: Input,\n            args: ['cdkDropListAutoScrollStep']\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 `CdkDragHandle`. It serves as\n * alternative token to the actual `CdkDragHandle` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst CDK_DRAG_HANDLE = new InjectionToken('CdkDragHandle');\n/** Handle that can be used to drag a CdkDrag instance. */\nclass CdkDragHandle {\n    constructor(element, parentDrag) {\n        this.element = element;\n        /** Emits when the state of the handle has changed. */\n        this._stateChanges = new Subject();\n        this._disabled = false;\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n            assertElementNode(element.nativeElement, 'cdkDragHandle');\n        }\n        this._parentDrag = parentDrag;\n    }\n    /** Whether starting to drag through this handle is disabled. */\n    get disabled() { return this._disabled; }\n    set disabled(value) {\n        this._disabled = coerceBooleanProperty(value);\n        this._stateChanges.next(this);\n    }\n    ngOnDestroy() {\n        this._stateChanges.complete();\n    }\n}\nCdkDragHandle.ɵfac = function CdkDragHandle_Factory(t) { return new (t || CdkDragHandle)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(CDK_DRAG_PARENT, 12)); };\nCdkDragHandle.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkDragHandle, selectors: [[\"\", \"cdkDragHandle\", \"\"]], hostAttrs: [1, \"cdk-drag-handle\"], inputs: { disabled: [\"cdkDragHandleDisabled\", \"disabled\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CDK_DRAG_HANDLE, useExisting: CdkDragHandle }])] });\nCdkDragHandle.ctorParameters = () => [\n    { type: ElementRef },\n    { type: undefined, decorators: [{ type: Inject, args: [CDK_DRAG_PARENT,] }, { type: Optional }, { type: SkipSelf }] }\n];\nCdkDragHandle.propDecorators = {\n    disabled: [{ type: Input, args: ['cdkDragHandleDisabled',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkDragHandle, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkDragHandle]',\n                host: {\n                    'class': 'cdk-drag-handle'\n                },\n                providers: [{ provide: CDK_DRAG_HANDLE, useExisting: CdkDragHandle }]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [CDK_DRAG_PARENT]\n            }, {\n                type: Optional\n            }, {\n                type: SkipSelf\n            }] }]; }, { disabled: [{\n            type: Input,\n            args: ['cdkDragHandleDisabled']\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 `CdkDragPlaceholder`. It serves as\n * alternative token to the actual `CdkDragPlaceholder` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst CDK_DRAG_PLACEHOLDER = new InjectionToken('CdkDragPlaceholder');\n/**\n * Element that will be used as a template for the placeholder of a CdkDrag when\n * it is being dragged. The placeholder is displayed in place of the element being dragged.\n */\nclass CdkDragPlaceholder {\n    constructor(templateRef) {\n        this.templateRef = templateRef;\n    }\n}\nCdkDragPlaceholder.ɵfac = function CdkDragPlaceholder_Factory(t) { return new (t || CdkDragPlaceholder)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nCdkDragPlaceholder.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkDragPlaceholder, selectors: [[\"ng-template\", \"cdkDragPlaceholder\", \"\"]], inputs: { data: \"data\" }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CDK_DRAG_PLACEHOLDER, useExisting: CdkDragPlaceholder }])] });\nCdkDragPlaceholder.ctorParameters = () => [\n    { type: TemplateRef }\n];\nCdkDragPlaceholder.propDecorators = {\n    data: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkDragPlaceholder, [{\n        type: Directive,\n        args: [{\n                selector: 'ng-template[cdkDragPlaceholder]',\n                providers: [{ provide: CDK_DRAG_PLACEHOLDER, useExisting: CdkDragPlaceholder }]\n            }]\n    }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, { data: [{\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 * Injection token that can be used to reference instances of `CdkDragPreview`. It serves as\n * alternative token to the actual `CdkDragPreview` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst CDK_DRAG_PREVIEW = new InjectionToken('CdkDragPreview');\n/**\n * Element that will be used as a template for the preview\n * of a CdkDrag when it is being dragged.\n */\nclass CdkDragPreview {\n    constructor(templateRef) {\n        this.templateRef = templateRef;\n        this._matchSize = false;\n    }\n    /** Whether the preview should preserve the same size as the item that is being dragged. */\n    get matchSize() { return this._matchSize; }\n    set matchSize(value) { this._matchSize = coerceBooleanProperty(value); }\n}\nCdkDragPreview.ɵfac = function CdkDragPreview_Factory(t) { return new (t || CdkDragPreview)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nCdkDragPreview.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkDragPreview, selectors: [[\"ng-template\", \"cdkDragPreview\", \"\"]], inputs: { matchSize: \"matchSize\", data: \"data\" }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CDK_DRAG_PREVIEW, useExisting: CdkDragPreview }])] });\nCdkDragPreview.ctorParameters = () => [\n    { type: TemplateRef }\n];\nCdkDragPreview.propDecorators = {\n    data: [{ type: Input }],\n    matchSize: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkDragPreview, [{\n        type: Directive,\n        args: [{\n                selector: 'ng-template[cdkDragPreview]',\n                providers: [{ provide: CDK_DRAG_PREVIEW, useExisting: CdkDragPreview }]\n            }]\n    }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, { matchSize: [{\n            type: Input\n        }], data: [{\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 DRAG_HOST_CLASS = 'cdk-drag';\n/** Element that can be moved inside a CdkDropList container. */\nclass CdkDrag {\n    constructor(\n    /** Element that the draggable is attached to. */\n    element, \n    /** Droppable container that the draggable is a part of. */\n    dropContainer, \n    /**\n     * @deprecated `_document` parameter no longer being used and will be removed.\n     * @breaking-change 12.0.0\n     */\n    _document, _ngZone, _viewContainerRef, config, _dir, dragDrop, _changeDetectorRef, _selfHandle, _parentDrag) {\n        this.element = element;\n        this.dropContainer = dropContainer;\n        this._ngZone = _ngZone;\n        this._viewContainerRef = _viewContainerRef;\n        this._dir = _dir;\n        this._changeDetectorRef = _changeDetectorRef;\n        this._selfHandle = _selfHandle;\n        this._parentDrag = _parentDrag;\n        this._destroyed = new Subject();\n        /** Emits when the user starts dragging the item. */\n        this.started = new EventEmitter();\n        /** Emits when the user has released a drag item, before any animations have started. */\n        this.released = new EventEmitter();\n        /** Emits when the user stops dragging an item in the container. */\n        this.ended = new EventEmitter();\n        /** Emits when the user has moved the item into a new container. */\n        this.entered = new EventEmitter();\n        /** Emits when the user removes the item its container by dragging it into another container. */\n        this.exited = new EventEmitter();\n        /** Emits when the user drops the item inside a container. */\n        this.dropped = new EventEmitter();\n        /**\n         * Emits as the user is dragging the item. Use with caution,\n         * because this event will fire for every pixel that the user has dragged.\n         */\n        this.moved = new Observable((observer) => {\n            const subscription = this._dragRef.moved.pipe(map(movedEvent => ({\n                source: this,\n                pointerPosition: movedEvent.pointerPosition,\n                event: movedEvent.event,\n                delta: movedEvent.delta,\n                distance: movedEvent.distance\n            }))).subscribe(observer);\n            return () => {\n                subscription.unsubscribe();\n            };\n        });\n        this._dragRef = dragDrop.createDrag(element, {\n            dragStartThreshold: config && config.dragStartThreshold != null ?\n                config.dragStartThreshold : 5,\n            pointerDirectionChangeThreshold: config && config.pointerDirectionChangeThreshold != null ?\n                config.pointerDirectionChangeThreshold : 5,\n            zIndex: config === null || config === void 0 ? void 0 : config.zIndex,\n        });\n        this._dragRef.data = this;\n        // We have to keep track of the drag instances in order to be able to match an element to\n        // a drag instance. We can't go through the global registry of `DragRef`, because the root\n        // element could be different.\n        CdkDrag._dragInstances.push(this);\n        if (config) {\n            this._assignDefaults(config);\n        }\n        // Note that usually the container is assigned when the drop list is picks up the item, but in\n        // some cases (mainly transplanted views with OnPush, see #18341) we may end up in a situation\n        // where there are no items on the first change detection pass, but the items get picked up as\n        // soon as the user triggers another pass by dragging. This is a problem, because the item would\n        // have to switch from standalone mode to drag mode in the middle of the dragging sequence which\n        // is too late since the two modes save different kinds of information. We work around it by\n        // assigning the drop container both from here and the list.\n        if (dropContainer) {\n            this._dragRef._withDropContainer(dropContainer._dropListRef);\n            dropContainer.addItem(this);\n        }\n        this._syncInputs(this._dragRef);\n        this._handleEvents(this._dragRef);\n    }\n    /** Whether starting to drag this element is disabled. */\n    get disabled() {\n        return this._disabled || (this.dropContainer && this.dropContainer.disabled);\n    }\n    set disabled(value) {\n        this._disabled = coerceBooleanProperty(value);\n        this._dragRef.disabled = this._disabled;\n    }\n    /**\n     * Returns the element that is being used as a placeholder\n     * while the current element is being dragged.\n     */\n    getPlaceholderElement() {\n        return this._dragRef.getPlaceholderElement();\n    }\n    /** Returns the root draggable element. */\n    getRootElement() {\n        return this._dragRef.getRootElement();\n    }\n    /** Resets a standalone drag item to its initial position. */\n    reset() {\n        this._dragRef.reset();\n    }\n    /**\n     * Gets the pixel coordinates of the draggable outside of a drop container.\n     */\n    getFreeDragPosition() {\n        return this._dragRef.getFreeDragPosition();\n    }\n    ngAfterViewInit() {\n        // We need to wait for the zone to stabilize, in order for the reference\n        // element to be in the proper place in the DOM. This is mostly relevant\n        // for draggable elements inside portals since they get stamped out in\n        // their original DOM position and then they get transferred to the portal.\n        this._ngZone.onStable\n            .pipe(take(1), takeUntil(this._destroyed))\n            .subscribe(() => {\n            this._updateRootElement();\n            // Listen for any newly-added handles.\n            this._handles.changes.pipe(startWith(this._handles), \n            // Sync the new handles with the DragRef.\n            tap((handles) => {\n                const childHandleElements = handles\n                    .filter(handle => handle._parentDrag === this)\n                    .map(handle => handle.element);\n                // Usually handles are only allowed to be a descendant of the drag element, but if\n                // the consumer defined a different drag root, we should allow the drag element\n                // itself to be a handle too.\n                if (this._selfHandle && this.rootElementSelector) {\n                    childHandleElements.push(this.element);\n                }\n                this._dragRef.withHandles(childHandleElements);\n            }), \n            // Listen if the state of any of the handles changes.\n            switchMap((handles) => {\n                return merge(...handles.map(item => {\n                    return item._stateChanges.pipe(startWith(item));\n                }));\n            }), takeUntil(this._destroyed)).subscribe(handleInstance => {\n                // Enabled/disable the handle that changed in the DragRef.\n                const dragRef = this._dragRef;\n                const handle = handleInstance.element.nativeElement;\n                handleInstance.disabled ? dragRef.disableHandle(handle) : dragRef.enableHandle(handle);\n            });\n            if (this.freeDragPosition) {\n                this._dragRef.setFreeDragPosition(this.freeDragPosition);\n            }\n        });\n    }\n    ngOnChanges(changes) {\n        const rootSelectorChange = changes['rootElementSelector'];\n        const positionChange = changes['freeDragPosition'];\n        // We don't have to react to the first change since it's being\n        // handled in `ngAfterViewInit` where it needs to be deferred.\n        if (rootSelectorChange && !rootSelectorChange.firstChange) {\n            this._updateRootElement();\n        }\n        // Skip the first change since it's being handled in `ngAfterViewInit`.\n        if (positionChange && !positionChange.firstChange && this.freeDragPosition) {\n            this._dragRef.setFreeDragPosition(this.freeDragPosition);\n        }\n    }\n    ngOnDestroy() {\n        if (this.dropContainer) {\n            this.dropContainer.removeItem(this);\n        }\n        const index = CdkDrag._dragInstances.indexOf(this);\n        if (index > -1) {\n            CdkDrag._dragInstances.splice(index, 1);\n        }\n        this._destroyed.next();\n        this._destroyed.complete();\n        this._dragRef.dispose();\n    }\n    /** Syncs the root element with the `DragRef`. */\n    _updateRootElement() {\n        const element = this.element.nativeElement;\n        const rootElement = this.rootElementSelector ?\n            getClosestMatchingAncestor(element, this.rootElementSelector) : element;\n        if (rootElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            assertElementNode(rootElement, 'cdkDrag');\n        }\n        this._dragRef.withRootElement(rootElement || element);\n    }\n    /** Gets the boundary element, based on the `boundaryElement` value. */\n    _getBoundaryElement() {\n        const boundary = this.boundaryElement;\n        if (!boundary) {\n            return null;\n        }\n        if (typeof boundary === 'string') {\n            return getClosestMatchingAncestor(this.element.nativeElement, boundary);\n        }\n        const element = coerceElement(boundary);\n        if ((typeof ngDevMode === 'undefined' || ngDevMode) &&\n            !element.contains(this.element.nativeElement)) {\n            throw Error('Draggable element is not inside of the node passed into cdkDragBoundary.');\n        }\n        return element;\n    }\n    /** Syncs the inputs of the CdkDrag with the options of the underlying DragRef. */\n    _syncInputs(ref) {\n        ref.beforeStarted.subscribe(() => {\n            if (!ref.isDragging()) {\n                const dir = this._dir;\n                const dragStartDelay = this.dragStartDelay;\n                const placeholder = this._placeholderTemplate ? {\n                    template: this._placeholderTemplate.templateRef,\n                    context: this._placeholderTemplate.data,\n                    viewContainer: this._viewContainerRef\n                } : null;\n                const preview = this._previewTemplate ? {\n                    template: this._previewTemplate.templateRef,\n                    context: this._previewTemplate.data,\n                    matchSize: this._previewTemplate.matchSize,\n                    viewContainer: this._viewContainerRef\n                } : null;\n                ref.disabled = this.disabled;\n                ref.lockAxis = this.lockAxis;\n                ref.dragStartDelay = (typeof dragStartDelay === 'object' && dragStartDelay) ?\n                    dragStartDelay : coerceNumberProperty(dragStartDelay);\n                ref.constrainPosition = this.constrainPosition;\n                ref.previewClass = this.previewClass;\n                ref\n                    .withBoundaryElement(this._getBoundaryElement())\n                    .withPlaceholderTemplate(placeholder)\n                    .withPreviewTemplate(preview);\n                if (dir) {\n                    ref.withDirection(dir.value);\n                }\n            }\n        });\n        // This only needs to be resolved once.\n        ref.beforeStarted.pipe(take(1)).subscribe(() => {\n            var _a, _b;\n            // If we managed to resolve a parent through DI, use it.\n            if (this._parentDrag) {\n                ref.withParent(this._parentDrag._dragRef);\n                return;\n            }\n            // Otherwise fall back to resolving the parent by looking up the DOM. This can happen if\n            // the item was projected into another item by something like `ngTemplateOutlet`.\n            let parent = this.element.nativeElement.parentElement;\n            while (parent) {\n                // `classList` needs to be null checked, because IE doesn't have it on some elements.\n                if ((_a = parent.classList) === null || _a === void 0 ? void 0 : _a.contains(DRAG_HOST_CLASS)) {\n                    ref.withParent(((_b = CdkDrag._dragInstances.find(drag => {\n                        return drag.element.nativeElement === parent;\n                    })) === null || _b === void 0 ? void 0 : _b._dragRef) || null);\n                    break;\n                }\n                parent = parent.parentElement;\n            }\n        });\n    }\n    /** Handles the events from the underlying `DragRef`. */\n    _handleEvents(ref) {\n        ref.started.subscribe(() => {\n            this.started.emit({ source: this });\n            // Since all of these events run outside of change detection,\n            // we need to ensure that everything is marked correctly.\n            this._changeDetectorRef.markForCheck();\n        });\n        ref.released.subscribe(() => {\n            this.released.emit({ source: this });\n        });\n        ref.ended.subscribe(event => {\n            this.ended.emit({ source: this, distance: event.distance });\n            // Since all of these events run outside of change detection,\n            // we need to ensure that everything is marked correctly.\n            this._changeDetectorRef.markForCheck();\n        });\n        ref.entered.subscribe(event => {\n            this.entered.emit({\n                container: event.container.data,\n                item: this,\n                currentIndex: event.currentIndex\n            });\n        });\n        ref.exited.subscribe(event => {\n            this.exited.emit({\n                container: event.container.data,\n                item: this\n            });\n        });\n        ref.dropped.subscribe(event => {\n            this.dropped.emit({\n                previousIndex: event.previousIndex,\n                currentIndex: event.currentIndex,\n                previousContainer: event.previousContainer.data,\n                container: event.container.data,\n                isPointerOverContainer: event.isPointerOverContainer,\n                item: this,\n                distance: event.distance\n            });\n        });\n    }\n    /** Assigns the default input values based on a provided config object. */\n    _assignDefaults(config) {\n        const { lockAxis, dragStartDelay, constrainPosition, previewClass, boundaryElement, draggingDisabled, rootElementSelector } = config;\n        this.disabled = draggingDisabled == null ? false : draggingDisabled;\n        this.dragStartDelay = dragStartDelay || 0;\n        if (lockAxis) {\n            this.lockAxis = lockAxis;\n        }\n        if (constrainPosition) {\n            this.constrainPosition = constrainPosition;\n        }\n        if (previewClass) {\n            this.previewClass = previewClass;\n        }\n        if (boundaryElement) {\n            this.boundaryElement = boundaryElement;\n        }\n        if (rootElementSelector) {\n            this.rootElementSelector = rootElementSelector;\n        }\n    }\n}\nCdkDrag.ɵfac = function CdkDrag_Factory(t) { return new (t || CdkDrag)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(CDK_DROP_LIST, 12), ɵngcc0.ɵɵdirectiveInject(DOCUMENT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(CDK_DRAG_CONFIG, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(DragDrop), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(CDK_DRAG_HANDLE, 10), ɵngcc0.ɵɵdirectiveInject(CDK_DRAG_PARENT, 12)); };\nCdkDrag.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkDrag, selectors: [[\"\", \"cdkDrag\", \"\"]], contentQueries: function CdkDrag_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, CDK_DRAG_PREVIEW, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, CDK_DRAG_PLACEHOLDER, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, CDK_DRAG_HANDLE, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._previewTemplate = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._placeholderTemplate = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._handles = _t);\n    } }, hostAttrs: [1, \"cdk-drag\"], hostVars: 4, hostBindings: function CdkDrag_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵclassProp(\"cdk-drag-disabled\", ctx.disabled)(\"cdk-drag-dragging\", ctx._dragRef.isDragging());\n    } }, inputs: { disabled: [\"cdkDragDisabled\", \"disabled\"], dragStartDelay: [\"cdkDragStartDelay\", \"dragStartDelay\"], lockAxis: [\"cdkDragLockAxis\", \"lockAxis\"], constrainPosition: [\"cdkDragConstrainPosition\", \"constrainPosition\"], previewClass: [\"cdkDragPreviewClass\", \"previewClass\"], boundaryElement: [\"cdkDragBoundary\", \"boundaryElement\"], rootElementSelector: [\"cdkDragRootElement\", \"rootElementSelector\"], data: [\"cdkDragData\", \"data\"], freeDragPosition: [\"cdkDragFreeDragPosition\", \"freeDragPosition\"] }, outputs: { started: \"cdkDragStarted\", released: \"cdkDragReleased\", ended: \"cdkDragEnded\", entered: \"cdkDragEntered\", exited: \"cdkDragExited\", dropped: \"cdkDragDropped\", moved: \"cdkDragMoved\" }, exportAs: [\"cdkDrag\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CDK_DRAG_PARENT, useExisting: CdkDrag }]), ɵngcc0.ɵɵNgOnChangesFeature] });\nCdkDrag._dragInstances = [];\nCdkDrag.ctorParameters = () => [\n    { type: ElementRef },\n    { type: undefined, decorators: [{ type: Inject, args: [CDK_DROP_LIST,] }, { type: Optional }, { type: SkipSelf }] },\n    { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n    { type: NgZone },\n    { type: ViewContainerRef },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CDK_DRAG_CONFIG,] }] },\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: DragDrop },\n    { type: ChangeDetectorRef },\n    { type: CdkDragHandle, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [CDK_DRAG_HANDLE,] }] },\n    { type: CdkDrag, decorators: [{ type: Optional }, { type: SkipSelf }, { type: Inject, args: [CDK_DRAG_PARENT,] }] }\n];\nCdkDrag.propDecorators = {\n    _handles: [{ type: ContentChildren, args: [CDK_DRAG_HANDLE, { descendants: true },] }],\n    _previewTemplate: [{ type: ContentChild, args: [CDK_DRAG_PREVIEW,] }],\n    _placeholderTemplate: [{ type: ContentChild, args: [CDK_DRAG_PLACEHOLDER,] }],\n    data: [{ type: Input, args: ['cdkDragData',] }],\n    lockAxis: [{ type: Input, args: ['cdkDragLockAxis',] }],\n    rootElementSelector: [{ type: Input, args: ['cdkDragRootElement',] }],\n    boundaryElement: [{ type: Input, args: ['cdkDragBoundary',] }],\n    dragStartDelay: [{ type: Input, args: ['cdkDragStartDelay',] }],\n    freeDragPosition: [{ type: Input, args: ['cdkDragFreeDragPosition',] }],\n    disabled: [{ type: Input, args: ['cdkDragDisabled',] }],\n    constrainPosition: [{ type: Input, args: ['cdkDragConstrainPosition',] }],\n    previewClass: [{ type: Input, args: ['cdkDragPreviewClass',] }],\n    started: [{ type: Output, args: ['cdkDragStarted',] }],\n    released: [{ type: Output, args: ['cdkDragReleased',] }],\n    ended: [{ type: Output, args: ['cdkDragEnded',] }],\n    entered: [{ type: Output, args: ['cdkDragEntered',] }],\n    exited: [{ type: Output, args: ['cdkDragExited',] }],\n    dropped: [{ type: Output, args: ['cdkDragDropped',] }],\n    moved: [{ type: Output, args: ['cdkDragMoved',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkDrag, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkDrag]',\n                exportAs: 'cdkDrag',\n                host: {\n                    'class': DRAG_HOST_CLASS,\n                    '[class.cdk-drag-disabled]': 'disabled',\n                    '[class.cdk-drag-dragging]': '_dragRef.isDragging()'\n                },\n                providers: [{ provide: CDK_DRAG_PARENT, useExisting: CdkDrag }]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [CDK_DROP_LIST]\n            }, {\n                type: Optional\n            }, {\n                type: SkipSelf\n            }] }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ViewContainerRef }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [CDK_DRAG_CONFIG]\n            }] }, { type: ɵngcc2.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: DragDrop }, { type: ɵngcc0.ChangeDetectorRef }, { type: CdkDragHandle, decorators: [{\n                type: Optional\n            }, {\n                type: Self\n            }, {\n                type: Inject,\n                args: [CDK_DRAG_HANDLE]\n            }] }, { type: CdkDrag, decorators: [{\n                type: Optional\n            }, {\n                type: SkipSelf\n            }, {\n                type: Inject,\n                args: [CDK_DRAG_PARENT]\n            }] }]; }, { started: [{\n            type: Output,\n            args: ['cdkDragStarted']\n        }], released: [{\n            type: Output,\n            args: ['cdkDragReleased']\n        }], ended: [{\n            type: Output,\n            args: ['cdkDragEnded']\n        }], entered: [{\n            type: Output,\n            args: ['cdkDragEntered']\n        }], exited: [{\n            type: Output,\n            args: ['cdkDragExited']\n        }], dropped: [{\n            type: Output,\n            args: ['cdkDragDropped']\n        }], moved: [{\n            type: Output,\n            args: ['cdkDragMoved']\n        }], disabled: [{\n            type: Input,\n            args: ['cdkDragDisabled']\n        }], dragStartDelay: [{\n            type: Input,\n            args: ['cdkDragStartDelay']\n        }], lockAxis: [{\n            type: Input,\n            args: ['cdkDragLockAxis']\n        }], constrainPosition: [{\n            type: Input,\n            args: ['cdkDragConstrainPosition']\n        }], previewClass: [{\n            type: Input,\n            args: ['cdkDragPreviewClass']\n        }], boundaryElement: [{\n            type: Input,\n            args: ['cdkDragBoundary']\n        }], rootElementSelector: [{\n            type: Input,\n            args: ['cdkDragRootElement']\n        }], _handles: [{\n            type: ContentChildren,\n            args: [CDK_DRAG_HANDLE, { descendants: true }]\n        }], _previewTemplate: [{\n            type: ContentChild,\n            args: [CDK_DRAG_PREVIEW]\n        }], _placeholderTemplate: [{\n            type: ContentChild,\n            args: [CDK_DRAG_PLACEHOLDER]\n        }], data: [{\n            type: Input,\n            args: ['cdkDragData']\n        }], freeDragPosition: [{\n            type: Input,\n            args: ['cdkDragFreeDragPosition']\n        }] }); })();\n/** Gets the closest ancestor of an element that matches a selector. */\nfunction getClosestMatchingAncestor(element, selector) {\n    let currentElement = element.parentElement;\n    while (currentElement) {\n        // IE doesn't support `matches` so we have to fall back to `msMatchesSelector`.\n        if (currentElement.matches ? currentElement.matches(selector) :\n            currentElement.msMatchesSelector(selector)) {\n            return currentElement;\n        }\n        currentElement = currentElement.parentElement;\n    }\n    return null;\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 DragDropModule {\n}\nDragDropModule.ɵfac = function DragDropModule_Factory(t) { return new (t || DragDropModule)(); };\nDragDropModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: DragDropModule });\nDragDropModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ providers: [\n        DragDrop,\n    ], imports: [CdkScrollableModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(DragDropModule, [{\n        type: NgModule,\n        args: [{\n                declarations: [\n                    CdkDropList,\n                    CdkDropListGroup,\n                    CdkDrag,\n                    CdkDragHandle,\n                    CdkDragPreview,\n                    CdkDragPlaceholder,\n                ],\n                exports: [\n                    CdkScrollableModule,\n                    CdkDropList,\n                    CdkDropListGroup,\n                    CdkDrag,\n                    CdkDragHandle,\n                    CdkDragPreview,\n                    CdkDragPlaceholder,\n                ],\n                providers: [\n                    DragDrop,\n                ]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(DragDropModule, { declarations: function () { return [CdkDropList, CdkDropListGroup, CdkDrag, CdkDragHandle, CdkDragPreview, CdkDragPlaceholder]; }, exports: function () { return [CdkScrollableModule, CdkDropList, CdkDropListGroup, CdkDrag, CdkDragHandle, CdkDragPreview, CdkDragPlaceholder]; } }); })();\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 { CDK_DRAG_CONFIG, CDK_DRAG_HANDLE, CDK_DRAG_PARENT, CDK_DRAG_PLACEHOLDER, CDK_DRAG_PREVIEW, CDK_DROP_LIST, CDK_DROP_LIST_GROUP, CdkDrag, CdkDragHandle, CdkDragPlaceholder, CdkDragPreview, CdkDropList, CdkDropListGroup, DragDrop, DragDropModule, DragDropRegistry, DragRef, DropListRef, copyArrayItem, moveItemInArray, transferArrayItem };\n\n//# sourceMappingURL=drag-drop.js.map","import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, coerceStringArray } from '@angular/cdk/coercion';\nimport { Platform, _getShadowRoot } from '@angular/cdk/platform';\nimport { InjectionToken, EventEmitter, Directive, ChangeDetectorRef, ElementRef, Inject, ViewChild, TemplateRef, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, ContentChildren, forwardRef, ViewContainerRef, NgZone, 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 { DOCUMENT, CommonModule } from '@angular/common';\nimport { Overlay, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';\nimport { ViewportRuler, CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ESCAPE, hasModifierKey, ENTER, UP_ARROW, DOWN_ARROW, TAB } from '@angular/cdk/keycodes';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatFormField, MAT_FORM_FIELD } from '@angular/material/form-field';\nimport { take, switchMap, 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 */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/platform';\nimport * as ɵngcc2 from '@angular/common';\nimport * as ɵngcc3 from '@angular/cdk/overlay';\nimport * as ɵngcc4 from '@angular/cdk/bidi';\nimport * as ɵngcc5 from '@angular/cdk/scrolling';\nimport * as ɵngcc6 from '@angular/material/form-field';\n\nconst _c0 = [\"panel\"];\nfunction MatAutocomplete_ng_template_0_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\", 0, 1);\n    ɵngcc0.ɵɵprojection(2);\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const formFieldId_r1 = ctx.id;\n    const ctx_r0 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵproperty(\"id\", ctx_r0.id)(\"ngClass\", ctx_r0._classList);\n    ɵngcc0.ɵɵattribute(\"aria-label\", ctx_r0.ariaLabel || null)(\"aria-labelledby\", ctx_r0._getPanelAriaLabelledby(formFieldId_r1));\n} }\nconst _c1 = [\"*\"];\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 */\nclass MatAutocompleteBase {\n}\nconst _MatAutocompleteMixinBase = mixinDisableRipple(MatAutocompleteBase);\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 };\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 using the keyboard. */\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 === null || platform === void 0 ? void 0 : platform.SAFARI) || false;\n        this._autoActiveFirstOption = !!defaults.autoActiveFirstOption;\n    }\n    /** Whether the autocomplete panel is open. */\n    get isOpen() { return this._isOpen && this.showPanel; }\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() { return this._autoActiveFirstOption; }\n    set autoActiveFirstOption(value) {\n        this._autoActiveFirstOption = 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            this.optionActivated.emit({ source: this, option: this.options.toArray()[index] || null });\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 = function _MatAutocompleteBase_Factory(t) { return new (t || _MatAutocompleteBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform)); };\n_MatAutocompleteBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatAutocompleteBase, viewQuery: function _MatAutocompleteBase_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(TemplateRef, 7);\n        ɵngcc0.ɵɵviewQuery(_c0, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.template = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.panel = _t.first);\n    } }, inputs: { displayWith: \"displayWith\", autoActiveFirstOption: \"autoActiveFirstOption\", classList: [\"class\", \"classList\"], ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], panelWidth: \"panelWidth\" }, outputs: { optionSelected: \"optionSelected\", opened: \"opened\", closed: \"closed\", optionActivated: \"optionActivated\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n_MatAutocompleteBase.ctorParameters = () => [\n    { type: ChangeDetectorRef },\n    { type: ElementRef },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,] }] },\n    { type: Platform }\n];\n_MatAutocompleteBase.propDecorators = {\n    template: [{ type: ViewChild, args: [TemplateRef, { static: true },] }],\n    panel: [{ type: ViewChild, args: ['panel',] }],\n    ariaLabel: [{ type: Input, args: ['aria-label',] }],\n    ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n    displayWith: [{ type: Input }],\n    autoActiveFirstOption: [{ type: Input }],\n    panelWidth: [{ type: Input }],\n    optionSelected: [{ type: Output }],\n    opened: [{ type: Output }],\n    closed: [{ type: Output }],\n    optionActivated: [{ type: Output }],\n    classList: [{ type: Input, args: ['class',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatAutocompleteBase, [{\n        type: Directive\n    }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS]\n            }] }, { type: ɵngcc1.Platform }]; }, { displayWith: [{\n            type: Input\n        }], optionSelected: [{\n            type: Output\n        }], opened: [{\n            type: Output\n        }], closed: [{\n            type: Output\n        }], optionActivated: [{\n            type: Output\n        }], autoActiveFirstOption: [{\n            type: Input\n        }], classList: [{\n            type: Input,\n            args: ['class']\n        }], 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        }], panelWidth: [{\n            type: Input\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 = /*@__PURE__*/ function () { let ɵMatAutocomplete_BaseFactory; return function MatAutocomplete_Factory(t) { return (ɵMatAutocomplete_BaseFactory || (ɵMatAutocomplete_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatAutocomplete)))(t || MatAutocomplete); }; }();\nMatAutocomplete.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatAutocomplete, selectors: [[\"mat-autocomplete\"]], contentQueries: function MatAutocomplete_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_OPTGROUP, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatOption, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.optionGroups = _t);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.options = _t);\n    } }, hostAttrs: [1, \"mat-autocomplete\"], inputs: { disableRipple: \"disableRipple\" }, exportAs: [\"matAutocomplete\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete }\n        ]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 1, vars: 0, consts: [[\"role\", \"listbox\", 1, \"mat-autocomplete-panel\", 3, \"id\", \"ngClass\"], [\"panel\", \"\"]], template: function MatAutocomplete_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵtemplate(0, MatAutocomplete_ng_template_0_Template, 3, 4, \"ng-template\");\n    } }, directives: [ɵngcc2.NgClass], 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\"], encapsulation: 2, changeDetection: 0 });\nMatAutocomplete.propDecorators = {\n    optionGroups: [{ type: ContentChildren, args: [MAT_OPTGROUP, { descendants: true },] }],\n    options: [{ type: ContentChildren, args: [MatOption, { descendants: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocomplete, [{\n        type: Component,\n        args: [{\n                selector: 'mat-autocomplete',\n                template: \"<ng-template let-formFieldId=\\\"id\\\">\\n  <div class=\\\"mat-autocomplete-panel\\\"\\n       role=\\\"listbox\\\"\\n       [id]=\\\"id\\\"\\n       [attr.aria-label]=\\\"ariaLabel || null\\\"\\n       [attr.aria-labelledby]=\\\"_getPanelAriaLabelledby(formFieldId)\\\"\\n       [ngClass]=\\\"_classList\\\"\\n       #panel>\\n    <ng-content></ng-content>\\n  </div>\\n</ng-template>\\n\",\n                encapsulation: ViewEncapsulation.None,\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                exportAs: 'matAutocomplete',\n                inputs: ['disableRipple'],\n                host: {\n                    'class': 'mat-autocomplete'\n                },\n                providers: [\n                    { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatAutocomplete }\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\"]\n            }]\n    }], null, { 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 = function _MatAutocompleteOriginBase_Factory(t) { return new (t || _MatAutocompleteOriginBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\n_MatAutocompleteOriginBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatAutocompleteOriginBase });\n_MatAutocompleteOriginBase.ctorParameters = () => [\n    { type: ElementRef }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatAutocompleteOriginBase, [{\n        type: Directive\n    }], function () { return [{ type: ɵngcc0.ElementRef }]; }, null); })();\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 = /*@__PURE__*/ function () { let ɵMatAutocompleteOrigin_BaseFactory; return function MatAutocompleteOrigin_Factory(t) { return (ɵMatAutocompleteOrigin_BaseFactory || (ɵMatAutocompleteOrigin_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatAutocompleteOrigin)))(t || MatAutocompleteOrigin); }; }();\nMatAutocompleteOrigin.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatAutocompleteOrigin, selectors: [[\"\", \"matAutocompleteOrigin\", \"\"]], exportAs: [\"matAutocompleteOrigin\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocompleteOrigin, [{\n        type: Directive,\n        args: [{\n                selector: '[matAutocompleteOrigin]',\n                exportAs: 'matAutocompleteOrigin'\n            }]\n    }], null, null); })();\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 style constants are necessary to save here in order\n * to properly calculate the scrollTop of the panel. Because we are not\n * actually focusing the active item, scroll must be handled manually.\n */\n/**\n * The height of each autocomplete option.\n * @deprecated No longer being used. To be removed.\n * @breaking-change 12.0.0\n */\nconst AUTOCOMPLETE_OPTION_HEIGHT = 48;\n/**\n * The total height of the autocomplete panel.\n * @deprecated No longer being used. To be removed.\n * @breaking-change 12.0.0\n */\nconst AUTOCOMPLETE_PANEL_HEIGHT = 256;\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 autocomplete option selections. */\n        this.optionSelections = defer(() => {\n            if (this.autocomplete && this.autocomplete.options) {\n                return merge(...this.autocomplete.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\n                .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() { return this._autocompleteDisabled; }\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            this.autocomplete.closed.emit();\n        }\n        this.autocomplete._isOpen = this._overlayAttached = false;\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'))\n            .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 = (this._isInsideShadowRoot && event.composedPath ? event.composedPath()[0] :\n                event.target);\n            const formField = this._formField ? this._formField._elementRef.nativeElement : null;\n            const customOrigin = this.connectedTo ? this.connectedTo.elementRef.nativeElement : null;\n            return this._overlayAttached && clickTarget !== this._element.nativeElement &&\n                (!formField || !formField.contains(clickTarget)) &&\n                (!customOrigin || !customOrigin.contains(clickTarget)) &&\n                (!!this._overlayRef && !this._overlayRef.overlayElement.contains(clickTarget));\n        }));\n    }\n    // Implemented as part of ControlValueAccessor.\n    writeValue(value) {\n        Promise.resolve(null).then(() => this._setTriggerValue(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        // 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 && !hasModifierKey(event)) {\n            event.preventDefault();\n        }\n        if (this.activeOption && keyCode === ENTER && this.panelOpen) {\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 (this.panelOpen || keyCode === TAB) {\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            }\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._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    /**\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            const wasOpen = this.panelOpen;\n            this._resetActiveItem();\n            this.autocomplete._setVisibility();\n            if (this.panelOpen) {\n                this._overlayRef.updatePosition();\n                // If the `panelOpen` state changed, we need to make sure to emit the `opened`\n                // event, because we may not have emitted it when the panel was attached. This\n                // can happen 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 (wasOpen !== this.panelOpen) {\n                    this.autocomplete.opened.emit();\n                }\n            }\n            return this.panelClosingActions;\n        }), \n        // when the first closing event occurs...\n        take(1))\n            // set the value, close the panel, and complete.\n            .subscribe(event => this._setValueAndClose(event));\n    }\n    /** 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    _setTriggerValue(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        const inputValue = toDisplay != null ? toDisplay : '';\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 = inputValue;\n        }\n        else {\n            this._element.nativeElement.value = inputValue;\n        }\n        this._previousValue = inputValue;\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        if (event && event.source) {\n            this._clearPreviousSelectedOption(event.source);\n            this._setTriggerValue(event.source.value);\n            this._onChange(event.source.value);\n            this._element.nativeElement.focus();\n            this.autocomplete._emitSelectEvent(event.source);\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        var _a;\n        if (!this.autocomplete && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getMatAutocompleteMissingPanelError();\n        }\n        // We want to resolve this once, as late as possible so that we can be\n        // sure that the element has been moved into its final place in the DOM.\n        if (this._isInsideShadowRoot == null) {\n            this._isInsideShadowRoot = !!_getShadowRoot(this._element.nativeElement);\n        }\n        let overlayRef = this._overlayRef;\n        if (!overlayRef) {\n            this._portal = new TemplatePortal(this.autocomplete.template, this._viewContainerRef, { id: (_a = this._formField) === null || _a === void 0 ? void 0 : _a.getLabelId() });\n            overlayRef = this._overlay.create(this._getOverlayConfig());\n            this._overlayRef = 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                    this._resetActiveItem();\n                    this._closeKeyEventStream.next();\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            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        var _a;\n        return new OverlayConfig({\n            positionStrategy: this._getOverlayPosition(),\n            scrollStrategy: this._scrollStrategy(),\n            width: this._getPanelWidth(),\n            direction: this._dir,\n            panelClass: (_a = this._defaults) === null || _a === void 0 ? void 0 : _a.overlayPanelClass,\n        });\n    }\n    _getOverlayPosition() {\n        const strategy = this._overlay.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        var _a;\n        return ((_a = this._document) === null || _a === void 0 ? void 0 : _a.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}\n_MatAutocompleteTriggerBase.ɵfac = function _MatAutocompleteTriggerBase_Factory(t) { return new (t || _MatAutocompleteTriggerBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.Overlay), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_SCROLL_STRATEGY), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(MAT_FORM_FIELD, 9), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc5.ViewportRuler), ɵngcc0.ɵɵdirectiveInject(MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, 8)); };\n_MatAutocompleteTriggerBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatAutocompleteTriggerBase, inputs: { position: [\"matAutocompletePosition\", \"position\"], autocompleteAttribute: [\"autocomplete\", \"autocompleteAttribute\"], autocompleteDisabled: [\"matAutocompleteDisabled\", \"autocompleteDisabled\"], autocomplete: [\"matAutocomplete\", \"autocomplete\"], connectedTo: [\"matAutocompleteConnectedTo\", \"connectedTo\"] }, features: [ɵngcc0.ɵɵNgOnChangesFeature] });\n_MatAutocompleteTriggerBase.ctorParameters = () => [\n    { type: ElementRef },\n    { type: Overlay },\n    { type: ViewContainerRef },\n    { type: NgZone },\n    { type: ChangeDetectorRef },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY,] }] },\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: MatFormField, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD,] }, { type: Host }] },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n    { type: ViewportRuler },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,] }] }\n];\n_MatAutocompleteTriggerBase.propDecorators = {\n    autocomplete: [{ type: Input, args: ['matAutocomplete',] }],\n    position: [{ type: Input, args: ['matAutocompletePosition',] }],\n    connectedTo: [{ type: Input, args: ['matAutocompleteConnectedTo',] }],\n    autocompleteAttribute: [{ type: Input, args: ['autocomplete',] }],\n    autocompleteDisabled: [{ type: Input, args: ['matAutocompleteDisabled',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatAutocompleteTriggerBase, [{\n        type: Directive\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc3.Overlay }, { type: ɵngcc0.ViewContainerRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY]\n            }] }, { type: ɵngcc4.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: ɵngcc6.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: ɵngcc5.ViewportRuler }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_AUTOCOMPLETE_DEFAULT_OPTIONS]\n            }] }]; }, { position: [{\n            type: Input,\n            args: ['matAutocompletePosition']\n        }], autocompleteAttribute: [{\n            type: Input,\n            args: ['autocomplete']\n        }], autocompleteDisabled: [{\n            type: Input,\n            args: ['matAutocompleteDisabled']\n        }], autocomplete: [{\n            type: Input,\n            args: ['matAutocomplete']\n        }], connectedTo: [{\n            type: Input,\n            args: ['matAutocompleteConnectedTo']\n        }] }); })();\nclass MatAutocompleteTrigger extends _MatAutocompleteTriggerBase {\n    constructor() {\n        super(...arguments);\n        this._aboveClass = 'mat-autocomplete-panel-above';\n    }\n}\nMatAutocompleteTrigger.ɵfac = /*@__PURE__*/ function () { let ɵMatAutocompleteTrigger_BaseFactory; return function MatAutocompleteTrigger_Factory(t) { return (ɵMatAutocompleteTrigger_BaseFactory || (ɵMatAutocompleteTrigger_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatAutocompleteTrigger)))(t || MatAutocompleteTrigger); }; }();\nMatAutocompleteTrigger.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatAutocompleteTrigger, selectors: [[\"input\", \"matAutocomplete\", \"\"], [\"textarea\", \"matAutocomplete\", \"\"]], hostAttrs: [1, \"mat-autocomplete-trigger\"], hostVars: 7, hostBindings: function MatAutocompleteTrigger_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"focusin\", function MatAutocompleteTrigger_focusin_HostBindingHandler() { return ctx._handleFocus(); })(\"blur\", function MatAutocompleteTrigger_blur_HostBindingHandler() { return ctx._onTouched(); })(\"input\", function MatAutocompleteTrigger_input_HostBindingHandler($event) { return ctx._handleInput($event); })(\"keydown\", function MatAutocompleteTrigger_keydown_HostBindingHandler($event) { return ctx._handleKeydown($event); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"autocomplete\", ctx.autocompleteAttribute)(\"role\", ctx.autocompleteDisabled ? null : \"combobox\")(\"aria-autocomplete\", ctx.autocompleteDisabled ? null : \"list\")(\"aria-activedescendant\", ctx.panelOpen && ctx.activeOption ? ctx.activeOption.id : null)(\"aria-expanded\", ctx.autocompleteDisabled ? null : ctx.panelOpen.toString())(\"aria-owns\", ctx.autocompleteDisabled || !ctx.panelOpen ? null : ctx.autocomplete == null ? null : ctx.autocomplete.id)(\"aria-haspopup\", !ctx.autocompleteDisabled);\n    } }, exportAs: [\"matAutocompleteTrigger\"], features: [ɵngcc0.ɵɵProvidersFeature([MAT_AUTOCOMPLETE_VALUE_ACCESSOR]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocompleteTrigger, [{\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',\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                },\n                exportAs: 'matAutocompleteTrigger',\n                providers: [MAT_AUTOCOMPLETE_VALUE_ACCESSOR]\n            }]\n    }], null, null); })();\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 = function MatAutocompleteModule_Factory(t) { return new (t || MatAutocompleteModule)(); };\nMatAutocompleteModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatAutocompleteModule });\nMatAutocompleteModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ providers: [MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER], imports: [[\n            OverlayModule,\n            MatOptionModule,\n            MatCommonModule,\n            CommonModule\n        ], CdkScrollableModule,\n        MatOptionModule,\n        MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatAutocompleteModule, [{\n        type: NgModule,\n        args: [{\n                imports: [\n                    OverlayModule,\n                    MatOptionModule,\n                    MatCommonModule,\n                    CommonModule\n                ],\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    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatAutocompleteModule, { declarations: function () { return [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin]; }, imports: function () { return [OverlayModule,\n        MatOptionModule,\n        MatCommonModule,\n        CommonModule]; }, exports: function () { return [MatAutocomplete, MatAutocompleteTrigger, MatAutocompleteOrigin, CdkScrollableModule,\n        MatOptionModule,\n        MatCommonModule]; } }); })();\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 { AUTOCOMPLETE_OPTION_HEIGHT, AUTOCOMPLETE_PANEL_HEIGHT, 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\n//# sourceMappingURL=autocomplete.js.map","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { InjectionToken, forwardRef, EventEmitter, Directive, ChangeDetectorRef, Optional, Inject, ContentChildren, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, Attribute, ViewChild, NgModule } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { mixinDisableRipple, MatCommonModule, MatRippleModule } 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 * Injection token that can be used to configure the\n * default options for all button toggles within an app.\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/material/core';\n\nconst _c0 = [\"button\"];\nconst _c1 = [\"*\"];\nconst MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS = new InjectionToken('MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS');\n/**\n * Injection token that can be used to reference instances of `MatButtonToggleGroup`.\n * It serves as alternative token to the actual `MatButtonToggleGroup` class which\n * could cause unnecessary retention of the class and its component metadata.\n */\nconst MAT_BUTTON_TOGGLE_GROUP = new InjectionToken('MatButtonToggleGroup');\n/**\n * Provider Expression that allows mat-button-toggle-group to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)].\n * @docs-private\n */\nconst MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR = {\n    provide: NG_VALUE_ACCESSOR,\n    useExisting: forwardRef(() => MatButtonToggleGroup),\n    multi: true\n};\n// Counter used to generate unique IDs.\nlet uniqueIdCounter = 0;\n/** Change event object emitted by MatButtonToggle. */\nclass MatButtonToggleChange {\n    constructor(\n    /** The MatButtonToggle that emits the event. */\n    source, \n    /** The value assigned to the MatButtonToggle. */\n    value) {\n        this.source = source;\n        this.value = value;\n    }\n}\n/** Exclusive selection button toggle group that behaves like a radio-button group. */\nclass MatButtonToggleGroup {\n    constructor(_changeDetector, defaultOptions) {\n        this._changeDetector = _changeDetector;\n        this._vertical = false;\n        this._multiple = false;\n        this._disabled = false;\n        /**\n         * The method to be called in order to update ngModel.\n         * Now `ngModel` binding is not supported in multiple selection mode.\n         */\n        this._controlValueAccessorChangeFn = () => { };\n        /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n        this._onTouched = () => { };\n        this._name = `mat-button-toggle-group-${uniqueIdCounter++}`;\n        /**\n         * Event that emits whenever the value of the group changes.\n         * Used to facilitate two-way data binding.\n         * @docs-private\n         */\n        this.valueChange = new EventEmitter();\n        /** Event emitted when the group's value changes. */\n        this.change = new EventEmitter();\n        this.appearance =\n            defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n    }\n    /** `name` attribute for the underlying `input` element. */\n    get name() { return this._name; }\n    set name(value) {\n        this._name = value;\n        if (this._buttonToggles) {\n            this._buttonToggles.forEach(toggle => {\n                toggle.name = this._name;\n                toggle._markForCheck();\n            });\n        }\n    }\n    /** Whether the toggle group is vertical. */\n    get vertical() { return this._vertical; }\n    set vertical(value) {\n        this._vertical = coerceBooleanProperty(value);\n    }\n    /** Value of the toggle group. */\n    get value() {\n        const selected = this._selectionModel ? this._selectionModel.selected : [];\n        if (this.multiple) {\n            return selected.map(toggle => toggle.value);\n        }\n        return selected[0] ? selected[0].value : undefined;\n    }\n    set value(newValue) {\n        this._setSelectionByValue(newValue);\n        this.valueChange.emit(this.value);\n    }\n    /** Selected button toggles in the group. */\n    get selected() {\n        const selected = this._selectionModel ? this._selectionModel.selected : [];\n        return this.multiple ? selected : (selected[0] || null);\n    }\n    /** Whether multiple button toggles can be selected. */\n    get multiple() { return this._multiple; }\n    set multiple(value) {\n        this._multiple = coerceBooleanProperty(value);\n    }\n    /** Whether multiple button toggle group is disabled. */\n    get disabled() { return this._disabled; }\n    set disabled(value) {\n        this._disabled = coerceBooleanProperty(value);\n        if (this._buttonToggles) {\n            this._buttonToggles.forEach(toggle => toggle._markForCheck());\n        }\n    }\n    ngOnInit() {\n        this._selectionModel = new SelectionModel(this.multiple, undefined, false);\n    }\n    ngAfterContentInit() {\n        this._selectionModel.select(...this._buttonToggles.filter(toggle => toggle.checked));\n    }\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value Value to be set to the model.\n     */\n    writeValue(value) {\n        this.value = value;\n        this._changeDetector.markForCheck();\n    }\n    // Implemented as part of ControlValueAccessor.\n    registerOnChange(fn) {\n        this._controlValueAccessorChangeFn = 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    }\n    /** Dispatch change event with current selection and group value. */\n    _emitChangeEvent() {\n        const selected = this.selected;\n        const source = Array.isArray(selected) ? selected[selected.length - 1] : selected;\n        const event = new MatButtonToggleChange(source, this.value);\n        this._controlValueAccessorChangeFn(event.value);\n        this.change.emit(event);\n    }\n    /**\n     * Syncs a button toggle's selected state with the model value.\n     * @param toggle Toggle to be synced.\n     * @param select Whether the toggle should be selected.\n     * @param isUserInput Whether the change was a result of a user interaction.\n     * @param deferEvents Whether to defer emitting the change events.\n     */\n    _syncButtonToggle(toggle, select, isUserInput = false, deferEvents = false) {\n        // Deselect the currently-selected toggle, if we're in single-selection\n        // mode and the button being toggled isn't selected at the moment.\n        if (!this.multiple && this.selected && !toggle.checked) {\n            this.selected.checked = false;\n        }\n        if (this._selectionModel) {\n            if (select) {\n                this._selectionModel.select(toggle);\n            }\n            else {\n                this._selectionModel.deselect(toggle);\n            }\n        }\n        else {\n            deferEvents = true;\n        }\n        // We need to defer in some cases in order to avoid \"changed after checked errors\", however\n        // the side-effect is that we may end up updating the model value out of sequence in others\n        // The `deferEvents` flag allows us to decide whether to do it on a case-by-case basis.\n        if (deferEvents) {\n            Promise.resolve().then(() => this._updateModelValue(isUserInput));\n        }\n        else {\n            this._updateModelValue(isUserInput);\n        }\n    }\n    /** Checks whether a button toggle is selected. */\n    _isSelected(toggle) {\n        return this._selectionModel && this._selectionModel.isSelected(toggle);\n    }\n    /** Determines whether a button toggle should be checked on init. */\n    _isPrechecked(toggle) {\n        if (typeof this._rawValue === 'undefined') {\n            return false;\n        }\n        if (this.multiple && Array.isArray(this._rawValue)) {\n            return this._rawValue.some(value => toggle.value != null && value === toggle.value);\n        }\n        return toggle.value === this._rawValue;\n    }\n    /** Updates the selection state of the toggles in the group based on a value. */\n    _setSelectionByValue(value) {\n        this._rawValue = value;\n        if (!this._buttonToggles) {\n            return;\n        }\n        if (this.multiple && value) {\n            if (!Array.isArray(value) && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n                throw Error('Value must be an array in multiple-selection mode.');\n            }\n            this._clearSelection();\n            value.forEach((currentValue) => this._selectValue(currentValue));\n        }\n        else {\n            this._clearSelection();\n            this._selectValue(value);\n        }\n    }\n    /** Clears the selected toggles. */\n    _clearSelection() {\n        this._selectionModel.clear();\n        this._buttonToggles.forEach(toggle => toggle.checked = false);\n    }\n    /** Selects a value if there's a toggle that corresponds to it. */\n    _selectValue(value) {\n        const correspondingOption = this._buttonToggles.find(toggle => {\n            return toggle.value != null && toggle.value === value;\n        });\n        if (correspondingOption) {\n            correspondingOption.checked = true;\n            this._selectionModel.select(correspondingOption);\n        }\n    }\n    /** Syncs up the group's value with the model and emits the change event. */\n    _updateModelValue(isUserInput) {\n        // Only emit the change event for user input.\n        if (isUserInput) {\n            this._emitChangeEvent();\n        }\n        // Note: we emit this one no matter whether it was a user interaction, because\n        // it is used by Angular to sync up the two-way data binding.\n        this.valueChange.emit(this.value);\n    }\n}\nMatButtonToggleGroup.ɵfac = function MatButtonToggleGroup_Factory(t) { return new (t || MatButtonToggleGroup)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS, 8)); };\nMatButtonToggleGroup.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatButtonToggleGroup, selectors: [[\"mat-button-toggle-group\"]], contentQueries: function MatButtonToggleGroup_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatButtonToggle, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._buttonToggles = _t);\n    } }, hostAttrs: [\"role\", \"group\", 1, \"mat-button-toggle-group\"], hostVars: 5, hostBindings: function MatButtonToggleGroup_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"aria-disabled\", ctx.disabled);\n        ɵngcc0.ɵɵclassProp(\"mat-button-toggle-vertical\", ctx.vertical)(\"mat-button-toggle-group-appearance-standard\", ctx.appearance === \"standard\");\n    } }, inputs: { appearance: \"appearance\", name: \"name\", vertical: \"vertical\", value: \"value\", multiple: \"multiple\", disabled: \"disabled\" }, outputs: { valueChange: \"valueChange\", change: \"change\" }, exportAs: [\"matButtonToggleGroup\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,\n            { provide: MAT_BUTTON_TOGGLE_GROUP, useExisting: MatButtonToggleGroup },\n        ])] });\nMatButtonToggleGroup.ctorParameters = () => [\n    { type: ChangeDetectorRef },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS,] }] }\n];\nMatButtonToggleGroup.propDecorators = {\n    _buttonToggles: [{ type: ContentChildren, args: [forwardRef(() => MatButtonToggle), {\n                    // Note that this would technically pick up toggles\n                    // from nested groups, but that's not a case that we support.\n                    descendants: true\n                },] }],\n    appearance: [{ type: Input }],\n    name: [{ type: Input }],\n    vertical: [{ type: Input }],\n    value: [{ type: Input }],\n    valueChange: [{ type: Output }],\n    multiple: [{ type: Input }],\n    disabled: [{ type: Input }],\n    change: [{ type: Output }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatButtonToggleGroup, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-button-toggle-group',\n                providers: [\n                    MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR,\n                    { provide: MAT_BUTTON_TOGGLE_GROUP, useExisting: MatButtonToggleGroup },\n                ],\n                host: {\n                    'role': 'group',\n                    'class': 'mat-button-toggle-group',\n                    '[attr.aria-disabled]': 'disabled',\n                    '[class.mat-button-toggle-vertical]': 'vertical',\n                    '[class.mat-button-toggle-group-appearance-standard]': 'appearance === \"standard\"'\n                },\n                exportAs: 'matButtonToggleGroup'\n            }]\n    }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS]\n            }] }]; }, { valueChange: [{\n            type: Output\n        }], change: [{\n            type: Output\n        }], appearance: [{\n            type: Input\n        }], name: [{\n            type: Input\n        }], vertical: [{\n            type: Input\n        }], value: [{\n            type: Input\n        }], multiple: [{\n            type: Input\n        }], disabled: [{\n            type: Input\n        }], _buttonToggles: [{\n            type: ContentChildren,\n            args: [forwardRef(() => MatButtonToggle), {\n                    // Note that this would technically pick up toggles\n                    // from nested groups, but that's not a case that we support.\n                    descendants: true\n                }]\n        }] }); })();\n// Boilerplate for applying mixins to the MatButtonToggle class.\n/** @docs-private */\nclass MatButtonToggleBase {\n}\nconst _MatButtonToggleMixinBase = mixinDisableRipple(MatButtonToggleBase);\n/** Single button inside of a toggle group. */\nclass MatButtonToggle extends _MatButtonToggleMixinBase {\n    constructor(toggleGroup, _changeDetectorRef, _elementRef, _focusMonitor, defaultTabIndex, defaultOptions) {\n        super();\n        this._changeDetectorRef = _changeDetectorRef;\n        this._elementRef = _elementRef;\n        this._focusMonitor = _focusMonitor;\n        this._isSingleSelector = false;\n        this._checked = false;\n        /**\n         * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n         */\n        this.ariaLabelledby = null;\n        this._disabled = false;\n        /** Event emitted when the group value changes. */\n        this.change = new EventEmitter();\n        const parsedTabIndex = Number(defaultTabIndex);\n        this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\n        this.buttonToggleGroup = toggleGroup;\n        this.appearance =\n            defaultOptions && defaultOptions.appearance ? defaultOptions.appearance : 'standard';\n    }\n    /** Unique ID for the underlying `button` element. */\n    get buttonId() { return `${this.id}-button`; }\n    /** The appearance style of the button. */\n    get appearance() {\n        return this.buttonToggleGroup ? this.buttonToggleGroup.appearance : this._appearance;\n    }\n    set appearance(value) {\n        this._appearance = value;\n    }\n    /** Whether the button is checked. */\n    get checked() {\n        return this.buttonToggleGroup ? this.buttonToggleGroup._isSelected(this) : this._checked;\n    }\n    set checked(value) {\n        const newValue = coerceBooleanProperty(value);\n        if (newValue !== this._checked) {\n            this._checked = newValue;\n            if (this.buttonToggleGroup) {\n                this.buttonToggleGroup._syncButtonToggle(this, this._checked);\n            }\n            this._changeDetectorRef.markForCheck();\n        }\n    }\n    /** Whether the button is disabled. */\n    get disabled() {\n        return this._disabled || (this.buttonToggleGroup && this.buttonToggleGroup.disabled);\n    }\n    set disabled(value) { this._disabled = coerceBooleanProperty(value); }\n    ngOnInit() {\n        const group = this.buttonToggleGroup;\n        this._isSingleSelector = group && !group.multiple;\n        this.id = this.id || `mat-button-toggle-${uniqueIdCounter++}`;\n        if (this._isSingleSelector) {\n            this.name = group.name;\n        }\n        if (group) {\n            if (group._isPrechecked(this)) {\n                this.checked = true;\n            }\n            else if (group._isSelected(this) !== this._checked) {\n                // As as side effect of the circular dependency between the toggle group and the button,\n                // we may end up in a state where the button is supposed to be checked on init, but it\n                // isn't, because the checked value was assigned too early. This can happen when Ivy\n                // assigns the static input value before the `ngOnInit` has run.\n                group._syncButtonToggle(this, this._checked);\n            }\n        }\n    }\n    ngAfterViewInit() {\n        this._focusMonitor.monitor(this._elementRef, true);\n    }\n    ngOnDestroy() {\n        const group = this.buttonToggleGroup;\n        this._focusMonitor.stopMonitoring(this._elementRef);\n        // Remove the toggle from the selection once it's destroyed. Needs to happen\n        // on the next tick in order to avoid \"changed after checked\" errors.\n        if (group && group._isSelected(this)) {\n            group._syncButtonToggle(this, false, false, true);\n        }\n    }\n    /** Focuses the button. */\n    focus(options) {\n        this._buttonElement.nativeElement.focus(options);\n    }\n    /** Checks the button toggle due to an interaction with the underlying native button. */\n    _onButtonClick() {\n        const newChecked = this._isSingleSelector ? true : !this._checked;\n        if (newChecked !== this._checked) {\n            this._checked = newChecked;\n            if (this.buttonToggleGroup) {\n                this.buttonToggleGroup._syncButtonToggle(this, this._checked, true);\n                this.buttonToggleGroup._onTouched();\n            }\n        }\n        // Emit a change event when it's the single selector\n        this.change.emit(new MatButtonToggleChange(this, this.value));\n    }\n    /**\n     * Marks the button toggle as needing checking for change detection.\n     * This method is exposed because the parent button toggle group will directly\n     * update bound properties of the radio button.\n     */\n    _markForCheck() {\n        // When the group value changes, the button will not be notified.\n        // Use `markForCheck` to explicit update button toggle's status.\n        this._changeDetectorRef.markForCheck();\n    }\n}\nMatButtonToggle.ɵfac = function MatButtonToggle_Factory(t) { return new (t || MatButtonToggle)(ɵngcc0.ɵɵdirectiveInject(MAT_BUTTON_TOGGLE_GROUP, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵinjectAttribute('tabindex'), ɵngcc0.ɵɵdirectiveInject(MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS, 8)); };\nMatButtonToggle.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatButtonToggle, selectors: [[\"mat-button-toggle\"]], viewQuery: function MatButtonToggle_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(_c0, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._buttonElement = _t.first);\n    } }, hostAttrs: [\"role\", \"presentation\", 1, \"mat-button-toggle\"], hostVars: 12, hostBindings: function MatButtonToggle_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"focus\", function MatButtonToggle_focus_HostBindingHandler() { return ctx.focus(); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"aria-label\", null)(\"aria-labelledby\", null)(\"id\", ctx.id)(\"name\", null);\n        ɵngcc0.ɵɵclassProp(\"mat-button-toggle-standalone\", !ctx.buttonToggleGroup)(\"mat-button-toggle-checked\", ctx.checked)(\"mat-button-toggle-disabled\", ctx.disabled)(\"mat-button-toggle-appearance-standard\", ctx.appearance === \"standard\");\n    } }, inputs: { disableRipple: \"disableRipple\", ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], tabIndex: \"tabIndex\", appearance: \"appearance\", checked: \"checked\", disabled: \"disabled\", id: \"id\", name: \"name\", ariaLabel: [\"aria-label\", \"ariaLabel\"], value: \"value\" }, outputs: { change: \"change\" }, exportAs: [\"matButtonToggle\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 6, vars: 9, consts: [[\"type\", \"button\", 1, \"mat-button-toggle-button\", \"mat-focus-indicator\", 3, \"id\", \"disabled\", \"click\"], [\"button\", \"\"], [1, \"mat-button-toggle-label-content\"], [1, \"mat-button-toggle-focus-overlay\"], [\"matRipple\", \"\", 1, \"mat-button-toggle-ripple\", 3, \"matRippleTrigger\", \"matRippleDisabled\"]], template: function MatButtonToggle_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵelementStart(0, \"button\", 0, 1);\n        ɵngcc0.ɵɵlistener(\"click\", function MatButtonToggle_Template_button_click_0_listener() { return ctx._onButtonClick(); });\n        ɵngcc0.ɵɵelementStart(2, \"span\", 2);\n        ɵngcc0.ɵɵprojection(3);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelement(4, \"span\", 3);\n        ɵngcc0.ɵɵelement(5, \"span\", 4);\n    } if (rf & 2) {\n        const _r0 = ɵngcc0.ɵɵreference(1);\n        ɵngcc0.ɵɵproperty(\"id\", ctx.buttonId)(\"disabled\", ctx.disabled || null);\n        ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? -1 : ctx.tabIndex)(\"aria-pressed\", ctx.checked)(\"name\", ctx.name || null)(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledby);\n        ɵngcc0.ɵɵadvance(5);\n        ɵngcc0.ɵɵproperty(\"matRippleTrigger\", _r0)(\"matRippleDisabled\", ctx.disableRipple || ctx.disabled);\n    } }, directives: [ɵngcc2.MatRipple], styles: [\".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;border-radius:2px;-webkit-tap-highlight-color:transparent}.cdk-high-contrast-active .mat-button-toggle-standalone,.cdk-high-contrast-active .mat-button-toggle-group{outline:solid 1px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:4px}.cdk-high-contrast-active .mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.cdk-high-contrast-active .mat-button-toggle-group-appearance-standard{outline:0}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:1}.cdk-high-contrast-active .mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:.5}.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{opacity:.04}.mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:.12}.cdk-high-contrast-active .mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:.5}@media(hover: none){.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;line-height:36px;padding:0 16px;position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{border-radius:inherit;pointer-events:none;opacity:0;top:0;left:0;right:0;bottom:0;position:absolute}.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 36px}.cdk-high-contrast-active .mat-button-toggle-checked .mat-button-toggle-focus-overlay{opacity:.5;height:0}.cdk-high-contrast-active .mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatButtonToggle.ctorParameters = () => [\n    { type: MatButtonToggleGroup, decorators: [{ type: Optional }, { type: Inject, args: [MAT_BUTTON_TOGGLE_GROUP,] }] },\n    { type: ChangeDetectorRef },\n    { type: ElementRef },\n    { type: FocusMonitor },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS,] }] }\n];\nMatButtonToggle.propDecorators = {\n    ariaLabel: [{ type: Input, args: ['aria-label',] }],\n    ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n    _buttonElement: [{ type: ViewChild, args: ['button',] }],\n    id: [{ type: Input }],\n    name: [{ type: Input }],\n    value: [{ type: Input }],\n    tabIndex: [{ type: Input }],\n    appearance: [{ type: Input }],\n    checked: [{ type: Input }],\n    disabled: [{ type: Input }],\n    change: [{ type: Output }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatButtonToggle, [{\n        type: Component,\n        args: [{\n                selector: 'mat-button-toggle',\n                template: \"<button #button class=\\\"mat-button-toggle-button mat-focus-indicator\\\"\\n        type=\\\"button\\\"\\n        [id]=\\\"buttonId\\\"\\n        [attr.tabindex]=\\\"disabled ? -1 : tabIndex\\\"\\n        [attr.aria-pressed]=\\\"checked\\\"\\n        [disabled]=\\\"disabled || null\\\"\\n        [attr.name]=\\\"name || null\\\"\\n        [attr.aria-label]=\\\"ariaLabel\\\"\\n        [attr.aria-labelledby]=\\\"ariaLabelledby\\\"\\n        (click)=\\\"_onButtonClick()\\\">\\n  <span class=\\\"mat-button-toggle-label-content\\\">\\n    <ng-content></ng-content>\\n  </span>\\n</button>\\n\\n<span class=\\\"mat-button-toggle-focus-overlay\\\"></span>\\n<span class=\\\"mat-button-toggle-ripple\\\" matRipple\\n     [matRippleTrigger]=\\\"button\\\"\\n     [matRippleDisabled]=\\\"this.disableRipple || this.disabled\\\">\\n</span>\\n\",\n                encapsulation: ViewEncapsulation.None,\n                exportAs: 'matButtonToggle',\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                inputs: ['disableRipple'],\n                host: {\n                    '[class.mat-button-toggle-standalone]': '!buttonToggleGroup',\n                    '[class.mat-button-toggle-checked]': 'checked',\n                    '[class.mat-button-toggle-disabled]': 'disabled',\n                    '[class.mat-button-toggle-appearance-standard]': 'appearance === \"standard\"',\n                    'class': 'mat-button-toggle',\n                    '[attr.aria-label]': 'null',\n                    '[attr.aria-labelledby]': 'null',\n                    '[attr.id]': 'id',\n                    '[attr.name]': 'null',\n                    '(focus)': 'focus()',\n                    'role': 'presentation'\n                },\n                styles: [\".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;border-radius:2px;-webkit-tap-highlight-color:transparent}.cdk-high-contrast-active .mat-button-toggle-standalone,.cdk-high-contrast-active .mat-button-toggle-group{outline:solid 1px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:4px}.cdk-high-contrast-active .mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.cdk-high-contrast-active .mat-button-toggle-group-appearance-standard{outline:0}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:1}.cdk-high-contrast-active .mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:.5}.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{opacity:.04}.mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:.12}.cdk-high-contrast-active .mat-button-toggle-appearance-standard.cdk-keyboard-focused:not(.mat-button-toggle-disabled) .mat-button-toggle-focus-overlay{opacity:.5}@media(hover: none){.mat-button-toggle-appearance-standard:not(.mat-button-toggle-disabled):hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;line-height:36px;padding:0 16px;position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{border-radius:inherit;pointer-events:none;opacity:0;top:0;left:0;right:0;bottom:0;position:absolute}.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 36px}.cdk-high-contrast-active .mat-button-toggle-checked .mat-button-toggle-focus-overlay{opacity:.5;height:0}.cdk-high-contrast-active .mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}\\n\"]\n            }]\n    }], function () { return [{ type: MatButtonToggleGroup, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_BUTTON_TOGGLE_GROUP]\n            }] }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.FocusMonitor }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS]\n            }] }]; }, { ariaLabelledby: [{\n            type: Input,\n            args: ['aria-labelledby']\n        }], change: [{\n            type: Output\n        }], tabIndex: [{\n            type: Input\n        }], appearance: [{\n            type: Input\n        }], checked: [{\n            type: Input\n        }], disabled: [{\n            type: Input\n        }], id: [{\n            type: Input\n        }], name: [{\n            type: Input\n        }], ariaLabel: [{\n            type: Input,\n            args: ['aria-label']\n        }], _buttonElement: [{\n            type: ViewChild,\n            args: ['button']\n        }], value: [{\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 MatButtonToggleModule {\n}\nMatButtonToggleModule.ɵfac = function MatButtonToggleModule_Factory(t) { return new (t || MatButtonToggleModule)(); };\nMatButtonToggleModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatButtonToggleModule });\nMatButtonToggleModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[MatCommonModule, MatRippleModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatButtonToggleModule, [{\n        type: NgModule,\n        args: [{\n                imports: [MatCommonModule, MatRippleModule],\n                exports: [MatCommonModule, MatButtonToggleGroup, MatButtonToggle],\n                declarations: [MatButtonToggleGroup, MatButtonToggle]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatButtonToggleModule, { declarations: function () { return [MatButtonToggleGroup, MatButtonToggle]; }, imports: function () { return [MatCommonModule, MatRippleModule]; }, exports: function () { return [MatCommonModule, MatButtonToggleGroup, MatButtonToggle]; } }); })();\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_BUTTON_TOGGLE_DEFAULT_OPTIONS, MAT_BUTTON_TOGGLE_GROUP, MAT_BUTTON_TOGGLE_GROUP_VALUE_ACCESSOR, MatButtonToggle, MatButtonToggleChange, MatButtonToggleGroup, MatButtonToggleModule };\n\n//# sourceMappingURL=button-toggle.js.map","import { SPACE, BACKSPACE, DELETE, TAB, hasModifierKey, ENTER } from '@angular/cdk/keycodes';\nimport { InjectionToken, Directive, EventEmitter, ElementRef, NgZone, Optional, Inject, ChangeDetectorRef, Attribute, ContentChild, Input, Output, Component, ViewEncapsulation, ChangeDetectionStrategy, Self, ContentChildren, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinColor, mixinDisableRipple, RippleRenderer, MAT_RIPPLE_GLOBAL_OPTIONS, mixinErrorState, ErrorStateMatcher, MatCommonModule } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Platform } 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 { Directionality } from '@angular/cdk/bidi';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { NgForm, FormGroupDirective, NgControl } from '@angular/forms';\nimport { MatFormFieldControl } 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/** Event object emitted by MatChip when selected or deselected. */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/platform';\nimport * as ɵngcc2 from '@angular/cdk/bidi';\nimport * as ɵngcc3 from '@angular/forms';\nimport * as ɵngcc4 from '@angular/material/core';\n\nconst _c0 = [\"*\"];\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 = function MatChipAvatar_Factory(t) { return new (t || MatChipAvatar)(); };\nMatChipAvatar.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipAvatar, selectors: [[\"mat-chip-avatar\"], [\"\", \"matChipAvatar\", \"\"]], hostAttrs: [1, \"mat-chip-avatar\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_CHIP_AVATAR, useExisting: MatChipAvatar }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipAvatar, [{\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    }], null, null); })();\n/**\n * Dummy directive to add CSS class to chip trailing icon.\n * @docs-private\n */\nclass MatChipTrailingIcon {\n}\nMatChipTrailingIcon.ɵfac = function MatChipTrailingIcon_Factory(t) { return new (t || MatChipTrailingIcon)(); };\nMatChipTrailingIcon.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipTrailingIcon, selectors: [[\"mat-chip-trailing-icon\"], [\"\", \"matChipTrailingIcon\", \"\"]], hostAttrs: [1, \"mat-chip-trailing-icon\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_CHIP_TRAILING_ICON, useExisting: MatChipTrailingIcon }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipTrailingIcon, [{\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    }], null, null); })();\n/**\n * Material design styled Chip component. Used inside the MatChipList component.\n */\nclass MatChip extends _MatChipMixinBase {\n    constructor(_elementRef, _ngZone, platform, globalRippleOptions, _changeDetectorRef, _document, animationMode, tabIndex) {\n        super(_elementRef);\n        this._elementRef = _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        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 blured. */\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 || this.disableRipple || this._animationsDisabled ||\n            !!this.rippleConfig.disabled;\n    }\n    /** Whether the chip is selected. */\n    get selected() { return this._selected; }\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 `<mat-chip>` tags. */\n    get value() {\n        return this._value !== undefined\n            ? this._value\n            : this._elementRef.nativeElement.textContent;\n    }\n    set value(value) { this._value = value; }\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() { return this._selectable && this.chipListSelectable; }\n    set selectable(value) {\n        this._selectable = coerceBooleanProperty(value);\n    }\n    /** Whether the chip is disabled. */\n    get disabled() { return this._chipListDisabled || this._disabled; }\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() { return this._removable; }\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() : 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        else {\n            event.stopPropagation();\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\n            .pipe(take(1))\n            .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 = function MatChip_Factory(t) { return new (t || MatChip)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform), ɵngcc0.ɵɵdirectiveInject(MAT_RIPPLE_GLOBAL_OPTIONS, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(DOCUMENT), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatChip.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChip, selectors: [[\"mat-basic-chip\"], [\"\", \"mat-basic-chip\", \"\"], [\"mat-chip\"], [\"\", \"mat-chip\", \"\"]], contentQueries: function MatChip_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_CHIP_AVATAR, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_CHIP_TRAILING_ICON, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_CHIP_REMOVE, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.avatar = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.trailingIcon = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.removeIcon = _t.first);\n    } }, hostAttrs: [\"role\", \"option\", 1, \"mat-chip\", \"mat-focus-indicator\"], hostVars: 14, hostBindings: function MatChip_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"click\", function MatChip_click_HostBindingHandler($event) { return ctx._handleClick($event); })(\"keydown\", function MatChip_keydown_HostBindingHandler($event) { return ctx._handleKeydown($event); })(\"focus\", function MatChip_focus_HostBindingHandler() { return ctx.focus(); })(\"blur\", function MatChip_blur_HostBindingHandler() { return ctx._blur(); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? null : ctx.tabIndex)(\"disabled\", ctx.disabled || null)(\"aria-disabled\", ctx.disabled.toString())(\"aria-selected\", ctx.ariaSelected);\n        ɵngcc0.ɵɵclassProp(\"mat-chip-selected\", ctx.selected)(\"mat-chip-with-avatar\", ctx.avatar)(\"mat-chip-with-trailing-icon\", ctx.trailingIcon || ctx.removeIcon)(\"mat-chip-disabled\", ctx.disabled)(\"_mat-animation-noopable\", ctx._animationsDisabled);\n    } }, inputs: { color: \"color\", disableRipple: \"disableRipple\", tabIndex: \"tabIndex\", selected: \"selected\", value: \"value\", selectable: \"selectable\", disabled: \"disabled\", removable: \"removable\" }, outputs: { selectionChange: \"selectionChange\", destroyed: \"destroyed\", removed: \"removed\" }, exportAs: [\"matChip\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatChip.ctorParameters = () => [\n    { type: ElementRef },\n    { type: NgZone },\n    { type: Platform },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] },\n    { type: ChangeDetectorRef },\n    { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\nMatChip.propDecorators = {\n    avatar: [{ type: ContentChild, args: [MAT_CHIP_AVATAR,] }],\n    trailingIcon: [{ type: ContentChild, args: [MAT_CHIP_TRAILING_ICON,] }],\n    removeIcon: [{ type: ContentChild, args: [MAT_CHIP_REMOVE,] }],\n    selected: [{ type: Input }],\n    value: [{ type: Input }],\n    selectable: [{ type: Input }],\n    disabled: [{ type: Input }],\n    removable: [{ type: Input }],\n    selectionChange: [{ type: Output }],\n    destroyed: [{ type: Output }],\n    removed: [{ type: Output }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChip, [{\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                    'role': 'option',\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    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc1.Platform }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_RIPPLE_GLOBAL_OPTIONS]\n            }] }, { type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }]; }, { selectionChange: [{\n            type: Output\n        }], destroyed: [{\n            type: Output\n        }], removed: [{\n            type: Output\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        }], 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        }] }); })();\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 *     `<mat-chip>\n *       <mat-icon matChipRemove>cancel</mat-icon>\n *     </mat-chip>`\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    }\n}\nMatChipRemove.ɵfac = function MatChipRemove_Factory(t) { return new (t || MatChipRemove)(ɵngcc0.ɵɵdirectiveInject(MatChip), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef)); };\nMatChipRemove.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipRemove, selectors: [[\"\", \"matChipRemove\", \"\"]], hostAttrs: [1, \"mat-chip-remove\", \"mat-chip-trailing-icon\"], hostBindings: function MatChipRemove_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"click\", function MatChipRemove_click_HostBindingHandler($event) { return ctx._handleClick($event); });\n    } }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_CHIP_REMOVE, useExisting: MatChipRemove }])] });\nMatChipRemove.ctorParameters = () => [\n    { type: MatChip },\n    { type: ElementRef }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipRemove, [{\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    }], function () { return [{ type: MatChip }, { type: ɵngcc0.ElementRef }]; }, null); })();\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 */\nclass MatChipListBase {\n    constructor(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, \n    /** @docs-private */\n    ngControl) {\n        this._defaultErrorStateMatcher = _defaultErrorStateMatcher;\n        this._parentForm = _parentForm;\n        this._parentFormGroup = _parentFormGroup;\n        this.ngControl = ngControl;\n    }\n}\nconst _MatChipListMixinBase = mixinErrorState(MatChipListBase);\n// Increasing integer for generating unique ids for chip-list components.\nlet nextUniqueId = 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 _MatChipListMixinBase {\n    constructor(_elementRef, _changeDetectorRef, _dir, _parentForm, _parentFormGroup, _defaultErrorStateMatcher, \n    /** @docs-private */\n    ngControl) {\n        super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);\n        this._elementRef = _elementRef;\n        this._changeDetectorRef = _changeDetectorRef;\n        this._dir = _dir;\n        this.ngControl = ngControl;\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++}`;\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._required = false;\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() { return this.empty ? null : 'listbox'; }\n    /** Whether the user should be allowed to select multiple chips. */\n    get multiple() { return this._multiple; }\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() { return this._compareWith; }\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() { return this._value; }\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() { return this._required; }\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() { return !this.empty || this.focused; }\n    /**\n     * Implemented as part of MatFormFieldControl.\n     * @docs-private\n     */\n    get disabled() { return this.ngControl ? !!this.ngControl.disabled : this._disabled; }\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() { return this._selectable; }\n    set selectable(value) {\n        this._selectable = coerceBooleanProperty(value);\n        if (this.chips) {\n            this.chips.forEach(chip => chip.chipListSelectable = this._selectable);\n        }\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) {\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) { this._ariaDescribedby = ids.join(' '); }\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 they are on an empty input and hit backspace, focus the last chip\n        if (event.keyCode === BACKSPACE && this._isInputEmpty(target)) {\n            this._keyManager.setLastItemActive();\n            event.preventDefault();\n        }\n        else 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    _isInputEmpty(element) {\n        if (element && element.nodeName.toLowerCase() === 'input') {\n            let input = element;\n            return !input.value;\n        }\n        return false;\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            });\n        }\n    }\n}\nMatChipList.ɵfac = function MatChipList_Factory(t) { return new (t || MatChipList)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.NgForm, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.FormGroupDirective, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc4.ErrorStateMatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.NgControl, 10)); };\nMatChipList.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatChipList, selectors: [[\"mat-chip-list\"]], contentQueries: function MatChipList_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatChip, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.chips = _t);\n    } }, hostAttrs: [1, \"mat-chip-list\"], hostVars: 15, hostBindings: function MatChipList_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"focus\", function MatChipList_focus_HostBindingHandler() { return ctx.focus(); })(\"blur\", function MatChipList_blur_HostBindingHandler() { return ctx._blur(); })(\"keydown\", function MatChipList_keydown_HostBindingHandler($event) { return ctx._keydown($event); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵhostProperty(\"id\", ctx._uid);\n        ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? null : ctx._tabIndex)(\"aria-describedby\", ctx._ariaDescribedby || null)(\"aria-required\", ctx.role ? ctx.required : null)(\"aria-disabled\", ctx.disabled.toString())(\"aria-invalid\", ctx.errorState)(\"aria-multiselectable\", ctx.multiple)(\"role\", ctx.role)(\"aria-orientation\", ctx.ariaOrientation);\n        ɵngcc0.ɵɵclassProp(\"mat-chip-list-disabled\", ctx.disabled)(\"mat-chip-list-invalid\", ctx.errorState)(\"mat-chip-list-required\", ctx.required);\n    } }, inputs: { ariaOrientation: [\"aria-orientation\", \"ariaOrientation\"], multiple: \"multiple\", compareWith: \"compareWith\", value: \"value\", required: \"required\", placeholder: \"placeholder\", disabled: \"disabled\", selectable: \"selectable\", tabIndex: \"tabIndex\", errorStateMatcher: \"errorStateMatcher\" }, outputs: { change: \"change\", valueChange: \"valueChange\" }, exportAs: [\"matChipList\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MatFormFieldControl, useExisting: MatChipList }]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[1, \"mat-chip-list-wrapper\"]], template: function MatChipList_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n        ɵngcc0.ɵɵprojection(1);\n        ɵngcc0.ɵɵelementEnd();\n    } }, styles: [\".mat-chip{position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transform:translateZ(0);border:none;-webkit-appearance:none;-moz-appearance:none}.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-animation-noopable.mat-standard-chip{transition:none;animation:none}.mat-standard-chip .mat-chip-remove.mat-icon{width:18px;height: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:focus{outline:dotted 2px}.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}.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\"], encapsulation: 2, changeDetection: 0 });\nMatChipList.ctorParameters = () => [\n    { type: ElementRef },\n    { type: ChangeDetectorRef },\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: NgForm, decorators: [{ type: Optional }] },\n    { type: FormGroupDirective, decorators: [{ type: Optional }] },\n    { type: ErrorStateMatcher },\n    { type: NgControl, decorators: [{ type: Optional }, { type: Self }] }\n];\nMatChipList.propDecorators = {\n    errorStateMatcher: [{ type: Input }],\n    multiple: [{ type: Input }],\n    compareWith: [{ type: Input }],\n    value: [{ type: Input }],\n    required: [{ type: Input }],\n    placeholder: [{ type: Input }],\n    disabled: [{ type: Input }],\n    ariaOrientation: [{ type: Input, args: ['aria-orientation',] }],\n    selectable: [{ type: Input }],\n    tabIndex: [{ type: Input }],\n    change: [{ type: Output }],\n    valueChange: [{ type: Output }],\n    chips: [{ type: ContentChildren, 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(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipList, [{\n        type: Component,\n        args: [{\n                selector: 'mat-chip-list',\n                template: `<div class=\"mat-chip-list-wrapper\"><ng-content></ng-content></div>`,\n                exportAs: 'matChipList',\n                host: {\n                    '[attr.tabindex]': 'disabled ? null : _tabIndex',\n                    '[attr.aria-describedby]': '_ariaDescribedby || null',\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                },\n                providers: [{ provide: MatFormFieldControl, useExisting: MatChipList }],\n                encapsulation: ViewEncapsulation.None,\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                styles: [\".mat-chip{position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;transform:translateZ(0);border:none;-webkit-appearance:none;-moz-appearance:none}.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-animation-noopable.mat-standard-chip{transition:none;animation:none}.mat-standard-chip .mat-chip-remove.mat-icon{width:18px;height: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:focus{outline:dotted 2px}.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}.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\"]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc2.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: ɵngcc3.NgForm, decorators: [{\n                type: Optional\n            }] }, { type: ɵngcc3.FormGroupDirective, decorators: [{\n                type: Optional\n            }] }, { type: ɵngcc4.ErrorStateMatcher }, { type: ɵngcc3.NgControl, decorators: [{\n                type: Optional\n            }, {\n                type: Self\n            }] }]; }, { ariaOrientation: [{\n            type: Input,\n            args: ['aria-orientation']\n        }], change: [{\n            type: Output\n        }], valueChange: [{\n            type: Output\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        }], selectable: [{\n            type: Input\n        }], tabIndex: [{\n            type: Input\n        }], errorStateMatcher: [{\n            type: Input\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$1 = 0;\n/**\n * Directive that adds chip-specific behaviors to an input element inside `<mat-form-field>`.\n * May be placed inside or outside of an `<mat-chip-list>`.\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$1++}`;\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() { return this._addOnBlur; }\n    set addOnBlur(value) { this._addOnBlur = coerceBooleanProperty(value); }\n    /** Whether the input is disabled. */\n    get disabled() { return this._disabled || (this._chipList && this._chipList.disabled); }\n    set disabled(value) { this._disabled = coerceBooleanProperty(value); }\n    /** Whether the input is empty. */\n    get empty() { return !this._inputElement.value; }\n    ngOnChanges() {\n        this._chipList.stateChanges.next();\n    }\n    /** Utility method to make host definition/tests more clear. */\n    _keydown(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 && event.keyCode === TAB && !hasModifierKey(event, 'shiftKey')) {\n            this._chipList._allowFocusEscape();\n        }\n        this._emitChipEnd(event);\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._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({ input: this._inputElement, value: this._inputElement.value });\n            if (event) {\n                event.preventDefault();\n            }\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    /** 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 = function MatChipInput_Factory(t) { return new (t || MatChipInput)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(MAT_CHIPS_DEFAULT_OPTIONS)); };\nMatChipInput.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatChipInput, selectors: [[\"input\", \"matChipInputFor\", \"\"]], hostAttrs: [1, \"mat-chip-input\", \"mat-input-element\"], hostVars: 5, hostBindings: function MatChipInput_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"keydown\", function MatChipInput_keydown_HostBindingHandler($event) { return ctx._keydown($event); })(\"blur\", function MatChipInput_blur_HostBindingHandler() { return ctx._blur(); })(\"focus\", function MatChipInput_focus_HostBindingHandler() { return ctx._focus(); })(\"input\", function MatChipInput_input_HostBindingHandler() { return ctx._onInput(); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵhostProperty(\"id\", ctx.id);\n        ɵngcc0.ɵɵattribute(\"disabled\", ctx.disabled || null)(\"placeholder\", ctx.placeholder || null)(\"aria-invalid\", ctx._chipList && ctx._chipList.ngControl ? ctx._chipList.ngControl.invalid : null)(\"aria-required\", ctx._chipList && ctx._chipList.required || null);\n    } }, inputs: { separatorKeyCodes: [\"matChipInputSeparatorKeyCodes\", \"separatorKeyCodes\"], placeholder: \"placeholder\", id: \"id\", chipList: [\"matChipInputFor\", \"chipList\"], addOnBlur: [\"matChipInputAddOnBlur\", \"addOnBlur\"], disabled: \"disabled\" }, outputs: { chipEnd: \"matChipInputTokenEnd\" }, exportAs: [\"matChipInput\", \"matChipInputFor\"], features: [ɵngcc0.ɵɵNgOnChangesFeature] });\nMatChipInput.ctorParameters = () => [\n    { type: ElementRef },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_CHIPS_DEFAULT_OPTIONS,] }] }\n];\nMatChipInput.propDecorators = {\n    chipList: [{ type: Input, args: ['matChipInputFor',] }],\n    addOnBlur: [{ type: Input, args: ['matChipInputAddOnBlur',] }],\n    separatorKeyCodes: [{ type: Input, args: ['matChipInputSeparatorKeyCodes',] }],\n    chipEnd: [{ type: Output, args: ['matChipInputTokenEnd',] }],\n    placeholder: [{ type: Input }],\n    id: [{ type: Input }],\n    disabled: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipInput, [{\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                    '(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    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_CHIPS_DEFAULT_OPTIONS]\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        }], chipList: [{\n            type: Input,\n            args: ['matChipInputFor']\n        }], addOnBlur: [{\n            type: Input,\n            args: ['matChipInputAddOnBlur']\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];\nconst ɵ0 = {\n    separatorKeyCodes: [ENTER]\n};\nclass MatChipsModule {\n}\nMatChipsModule.ɵfac = function MatChipsModule_Factory(t) { return new (t || MatChipsModule)(); };\nMatChipsModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatChipsModule });\nMatChipsModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ providers: [\n        ErrorStateMatcher,\n        {\n            provide: MAT_CHIPS_DEFAULT_OPTIONS,\n            useValue: ɵ0\n        }\n    ], imports: [[MatCommonModule]] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatChipsModule, [{\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: ɵ0\n                    }\n                ]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatChipsModule, { declarations: function () { return [MatChipList, MatChip, MatChipInput, MatChipRemove, MatChipAvatar, MatChipTrailingIcon]; }, imports: function () { return [MatCommonModule]; }, exports: function () { return [MatChipList, MatChip, MatChipInput, MatChipRemove, MatChipAvatar, MatChipTrailingIcon]; } }); })();\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, ɵ0 };\n\n//# sourceMappingURL=chips.js.map","import { InjectionToken, forwardRef, EventEmitter, Directive, ChangeDetectorRef, Output, Input, ContentChildren, ElementRef, ViewChild, Component, ViewEncapsulation, ChangeDetectionStrategy, Optional, Inject, Attribute, NgModule } from '@angular/core';\nimport { mixinDisableRipple, mixinTabIndex, MatRippleModule, MatCommonModule } from '@angular/material/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { UniqueSelectionDispatcher } from '@angular/cdk/collections';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\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 */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/cdk/collections';\nimport * as ɵngcc3 from '@angular/material/core';\n\nconst _c0 = [\"input\"];\nconst _c1 = function () { return { enterDuration: 150 }; };\nconst _c2 = [\"*\"];\nconst MAT_RADIO_DEFAULT_OPTIONS = new InjectionToken('mat-radio-default-options', {\n    providedIn: 'root',\n    factory: MAT_RADIO_DEFAULT_OPTIONS_FACTORY\n});\nfunction MAT_RADIO_DEFAULT_OPTIONS_FACTORY() {\n    return {\n        color: 'accent'\n    };\n}\n// Increasing integer for generating unique ids for radio components.\nlet nextUniqueId = 0;\n/**\n * Provider Expression that allows mat-radio-group to register as a ControlValueAccessor. This\n * allows it to support [(ngModel)] and ngControl.\n * @docs-private\n */\nconst MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = {\n    provide: NG_VALUE_ACCESSOR,\n    useExisting: forwardRef(() => MatRadioGroup),\n    multi: true\n};\n/** Change event object emitted by MatRadio and MatRadioGroup. */\nclass MatRadioChange {\n    constructor(\n    /** The MatRadioButton that emits the change event. */\n    source, \n    /** The value of the MatRadioButton. */\n    value) {\n        this.source = source;\n        this.value = value;\n    }\n}\n/**\n * Injection token that can be used to inject instances of `MatRadioGroup`. It serves as\n * alternative token to the actual `MatRadioGroup` class which could cause unnecessary\n * retention of the class and its component metadata.\n */\nconst MAT_RADIO_GROUP = new InjectionToken('MatRadioGroup');\n/**\n * Base class with all of the `MatRadioGroup` functionality.\n * @docs-private\n */\nclass _MatRadioGroupBase {\n    constructor(_changeDetector) {\n        this._changeDetector = _changeDetector;\n        /** Selected value for the radio group. */\n        this._value = null;\n        /** The HTML name attribute applied to radio buttons in this group. */\n        this._name = `mat-radio-group-${nextUniqueId++}`;\n        /** The currently selected radio button. Should match value. */\n        this._selected = null;\n        /** Whether the `value` has been set to its initial value. */\n        this._isInitialized = false;\n        /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n        this._labelPosition = 'after';\n        /** Whether the radio group is disabled. */\n        this._disabled = false;\n        /** Whether the radio group is required. */\n        this._required = false;\n        /** The method to be called in order to update ngModel */\n        this._controlValueAccessorChangeFn = () => { };\n        /**\n         * onTouch function registered via registerOnTouch (ControlValueAccessor).\n         * @docs-private\n         */\n        this.onTouched = () => { };\n        /**\n         * Event emitted when the group value changes.\n         * Change events are only emitted when the value changes due to user interaction with\n         * a radio button (the same behavior as `<input type-\"radio\">`).\n         */\n        this.change = new EventEmitter();\n    }\n    /** Name of the radio button group. All radio buttons inside this group will use this name. */\n    get name() { return this._name; }\n    set name(value) {\n        this._name = value;\n        this._updateRadioButtonNames();\n    }\n    /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n    get labelPosition() {\n        return this._labelPosition;\n    }\n    set labelPosition(v) {\n        this._labelPosition = v === 'before' ? 'before' : 'after';\n        this._markRadiosForCheck();\n    }\n    /**\n     * Value for the radio-group. Should equal the value of the selected radio button if there is\n     * a corresponding radio button with a matching value. If there is not such a corresponding\n     * radio button, this value persists to be applied in case a new radio button is added with a\n     * matching value.\n     */\n    get value() { return this._value; }\n    set value(newValue) {\n        if (this._value !== newValue) {\n            // Set this before proceeding to ensure no circular loop occurs with selection.\n            this._value = newValue;\n            this._updateSelectedRadioFromValue();\n            this._checkSelectedRadioButton();\n        }\n    }\n    _checkSelectedRadioButton() {\n        if (this._selected && !this._selected.checked) {\n            this._selected.checked = true;\n        }\n    }\n    /**\n     * The currently selected radio button. If set to a new radio button, the radio group value\n     * will be updated to match the new selected button.\n     */\n    get selected() { return this._selected; }\n    set selected(selected) {\n        this._selected = selected;\n        this.value = selected ? selected.value : null;\n        this._checkSelectedRadioButton();\n    }\n    /** Whether the radio group is disabled */\n    get disabled() { return this._disabled; }\n    set disabled(value) {\n        this._disabled = coerceBooleanProperty(value);\n        this._markRadiosForCheck();\n    }\n    /** Whether the radio group is required */\n    get required() { return this._required; }\n    set required(value) {\n        this._required = coerceBooleanProperty(value);\n        this._markRadiosForCheck();\n    }\n    /**\n     * Initialize properties once content children are available.\n     * This allows us to propagate relevant attributes to associated buttons.\n     */\n    ngAfterContentInit() {\n        // Mark this component as initialized in AfterContentInit because the initial value can\n        // possibly be set by NgModel on MatRadioGroup, and it is possible that the OnInit of the\n        // NgModel occurs *after* the OnInit of the MatRadioGroup.\n        this._isInitialized = true;\n    }\n    /**\n     * Mark this group as being \"touched\" (for ngModel). Meant to be called by the contained\n     * radio buttons upon their blur.\n     */\n    _touch() {\n        if (this.onTouched) {\n            this.onTouched();\n        }\n    }\n    _updateRadioButtonNames() {\n        if (this._radios) {\n            this._radios.forEach(radio => {\n                radio.name = this.name;\n                radio._markForCheck();\n            });\n        }\n    }\n    /** Updates the `selected` radio button from the internal _value state. */\n    _updateSelectedRadioFromValue() {\n        // If the value already matches the selected radio, do nothing.\n        const isAlreadySelected = this._selected !== null && this._selected.value === this._value;\n        if (this._radios && !isAlreadySelected) {\n            this._selected = null;\n            this._radios.forEach(radio => {\n                radio.checked = this.value === radio.value;\n                if (radio.checked) {\n                    this._selected = radio;\n                }\n            });\n        }\n    }\n    /** Dispatch change event with current selection and group value. */\n    _emitChangeEvent() {\n        if (this._isInitialized) {\n            this.change.emit(new MatRadioChange(this._selected, this._value));\n        }\n    }\n    _markRadiosForCheck() {\n        if (this._radios) {\n            this._radios.forEach(radio => radio._markForCheck());\n        }\n    }\n    /**\n     * Sets the model value. Implemented as part of ControlValueAccessor.\n     * @param value\n     */\n    writeValue(value) {\n        this.value = value;\n        this._changeDetector.markForCheck();\n    }\n    /**\n     * Registers a callback to be triggered when the model value changes.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    registerOnChange(fn) {\n        this._controlValueAccessorChangeFn = fn;\n    }\n    /**\n     * Registers a callback to be triggered when the control is touched.\n     * Implemented as part of ControlValueAccessor.\n     * @param fn Callback to be registered.\n     */\n    registerOnTouched(fn) {\n        this.onTouched = fn;\n    }\n    /**\n     * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.\n     * @param isDisabled Whether the control should be disabled.\n     */\n    setDisabledState(isDisabled) {\n        this.disabled = isDisabled;\n        this._changeDetector.markForCheck();\n    }\n}\n_MatRadioGroupBase.ɵfac = function _MatRadioGroupBase_Factory(t) { return new (t || _MatRadioGroupBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\n_MatRadioGroupBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatRadioGroupBase, inputs: { name: \"name\", labelPosition: \"labelPosition\", value: \"value\", selected: \"selected\", disabled: \"disabled\", required: \"required\", color: \"color\" }, outputs: { change: \"change\" } });\n_MatRadioGroupBase.ctorParameters = () => [\n    { type: ChangeDetectorRef }\n];\n_MatRadioGroupBase.propDecorators = {\n    change: [{ type: Output }],\n    color: [{ type: Input }],\n    name: [{ type: Input }],\n    labelPosition: [{ type: Input }],\n    value: [{ type: Input }],\n    selected: [{ type: Input }],\n    disabled: [{ type: Input }],\n    required: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatRadioGroupBase, [{\n        type: Directive\n    }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }]; }, { change: [{\n            type: Output\n        }], name: [{\n            type: Input\n        }], labelPosition: [{\n            type: Input\n        }], value: [{\n            type: Input\n        }], selected: [{\n            type: Input\n        }], disabled: [{\n            type: Input\n        }], required: [{\n            type: Input\n        }], color: [{\n            type: Input\n        }] }); })();\n/**\n * A group of radio buttons. May contain one or more `<mat-radio-button>` elements.\n */\nclass MatRadioGroup extends _MatRadioGroupBase {\n}\nMatRadioGroup.ɵfac = /*@__PURE__*/ function () { let ɵMatRadioGroup_BaseFactory; return function MatRadioGroup_Factory(t) { return (ɵMatRadioGroup_BaseFactory || (ɵMatRadioGroup_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatRadioGroup)))(t || MatRadioGroup); }; }();\nMatRadioGroup.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatRadioGroup, selectors: [[\"mat-radio-group\"]], contentQueries: function MatRadioGroup_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatRadioButton, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._radios = _t);\n    } }, hostAttrs: [\"role\", \"radiogroup\", 1, \"mat-radio-group\"], exportAs: [\"matRadioGroup\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR,\n            { provide: MAT_RADIO_GROUP, useExisting: MatRadioGroup },\n        ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatRadioGroup.propDecorators = {\n    _radios: [{ type: ContentChildren, args: [forwardRef(() => MatRadioButton), { descendants: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatRadioGroup, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-radio-group',\n                exportAs: 'matRadioGroup',\n                providers: [\n                    MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR,\n                    { provide: MAT_RADIO_GROUP, useExisting: MatRadioGroup },\n                ],\n                host: {\n                    'role': 'radiogroup',\n                    'class': 'mat-radio-group'\n                }\n            }]\n    }], null, { _radios: [{\n            type: ContentChildren,\n            args: [forwardRef(() => MatRadioButton), { descendants: true }]\n        }] }); })();\n// Boilerplate for applying mixins to MatRadioButton.\n/** @docs-private */\nclass MatRadioButtonBase {\n    constructor(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n}\n// As per Material design specifications the selection control radio should use the accent color\n// palette by default. https://material.io/guidelines/components/selection-controls.html\nconst _MatRadioButtonMixinBase = mixinDisableRipple(mixinTabIndex(MatRadioButtonBase));\n/**\n * Base class with all of the `MatRadioButton` functionality.\n * @docs-private\n */\nclass _MatRadioButtonBase extends _MatRadioButtonMixinBase {\n    constructor(radioGroup, elementRef, _changeDetector, _focusMonitor, _radioDispatcher, _animationMode, _providerOverride, tabIndex) {\n        super(elementRef);\n        this._changeDetector = _changeDetector;\n        this._focusMonitor = _focusMonitor;\n        this._radioDispatcher = _radioDispatcher;\n        this._animationMode = _animationMode;\n        this._providerOverride = _providerOverride;\n        this._uniqueId = `mat-radio-${++nextUniqueId}`;\n        /** The unique ID for the radio button. */\n        this.id = this._uniqueId;\n        /**\n         * Event emitted when the checked state of this radio button changes.\n         * Change events are only emitted when the value changes due to user interaction with\n         * the radio button (the same behavior as `<input type-\"radio\">`).\n         */\n        this.change = new EventEmitter();\n        /** Whether this radio is checked. */\n        this._checked = false;\n        /** Value assigned to this radio. */\n        this._value = null;\n        /** Unregister function for _radioDispatcher */\n        this._removeUniqueSelectionListener = () => { };\n        // Assertions. Ideally these should be stripped out by the compiler.\n        // TODO(jelbourn): Assert that there's no name binding AND a parent radio group.\n        this.radioGroup = radioGroup;\n        if (tabIndex) {\n            this.tabIndex = coerceNumberProperty(tabIndex, 0);\n        }\n        this._removeUniqueSelectionListener =\n            _radioDispatcher.listen((id, name) => {\n                if (id !== this.id && name === this.name) {\n                    this.checked = false;\n                }\n            });\n    }\n    /** Whether this radio button is checked. */\n    get checked() { return this._checked; }\n    set checked(value) {\n        const newCheckedState = coerceBooleanProperty(value);\n        if (this._checked !== newCheckedState) {\n            this._checked = newCheckedState;\n            if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) {\n                this.radioGroup.selected = this;\n            }\n            else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) {\n                // When unchecking the selected radio button, update the selected radio\n                // property on the group.\n                this.radioGroup.selected = null;\n            }\n            if (newCheckedState) {\n                // Notify all radio buttons with the same name to un-check.\n                this._radioDispatcher.notify(this.id, this.name);\n            }\n            this._changeDetector.markForCheck();\n        }\n    }\n    /** The value of this radio button. */\n    get value() { return this._value; }\n    set value(value) {\n        if (this._value !== value) {\n            this._value = value;\n            if (this.radioGroup !== null) {\n                if (!this.checked) {\n                    // Update checked when the value changed to match the radio group's value\n                    this.checked = this.radioGroup.value === value;\n                }\n                if (this.checked) {\n                    this.radioGroup.selected = this;\n                }\n            }\n        }\n    }\n    /** Whether the label should appear after or before the radio button. Defaults to 'after' */\n    get labelPosition() {\n        return this._labelPosition || (this.radioGroup && this.radioGroup.labelPosition) || 'after';\n    }\n    set labelPosition(value) {\n        this._labelPosition = value;\n    }\n    /** Whether the radio button is disabled. */\n    get disabled() {\n        return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled);\n    }\n    set disabled(value) {\n        this._setDisabled(coerceBooleanProperty(value));\n    }\n    /** Whether the radio button is required. */\n    get required() {\n        return this._required || (this.radioGroup && this.radioGroup.required);\n    }\n    set required(value) {\n        this._required = coerceBooleanProperty(value);\n    }\n    /** Theme color of the radio button. */\n    get color() {\n        return this._color ||\n            (this.radioGroup && this.radioGroup.color) ||\n            this._providerOverride && this._providerOverride.color || 'accent';\n    }\n    set color(newValue) { this._color = newValue; }\n    /** ID of the native input element inside `<mat-radio-button>` */\n    get inputId() { return `${this.id || this._uniqueId}-input`; }\n    /** Focuses the radio button. */\n    focus(options, origin) {\n        if (origin) {\n            this._focusMonitor.focusVia(this._inputElement, origin, options);\n        }\n        else {\n            this._inputElement.nativeElement.focus(options);\n        }\n    }\n    /**\n     * Marks the radio button as needing checking for change detection.\n     * This method is exposed because the parent radio group will directly\n     * update bound properties of the radio button.\n     */\n    _markForCheck() {\n        // When group value changes, the button will not be notified. Use `markForCheck` to explicit\n        // update radio button's status\n        this._changeDetector.markForCheck();\n    }\n    ngOnInit() {\n        if (this.radioGroup) {\n            // If the radio is inside a radio group, determine if it should be checked\n            this.checked = this.radioGroup.value === this._value;\n            if (this.checked) {\n                this.radioGroup.selected = this;\n            }\n            // Copy name from parent radio group\n            this.name = this.radioGroup.name;\n        }\n    }\n    ngAfterViewInit() {\n        this._focusMonitor\n            .monitor(this._elementRef, true)\n            .subscribe(focusOrigin => {\n            if (!focusOrigin && this.radioGroup) {\n                this.radioGroup._touch();\n            }\n        });\n    }\n    ngOnDestroy() {\n        this._focusMonitor.stopMonitoring(this._elementRef);\n        this._removeUniqueSelectionListener();\n    }\n    /** Dispatch change event with current value. */\n    _emitChangeEvent() {\n        this.change.emit(new MatRadioChange(this, this._value));\n    }\n    _isRippleDisabled() {\n        return this.disableRipple || this.disabled;\n    }\n    _onInputClick(event) {\n        // We have to stop propagation for click events on the visual hidden input element.\n        // By default, when a user clicks on a label element, a generated click event will be\n        // dispatched on the associated input element. Since we are using a label element as our\n        // root container, the click event on the `radio-button` will be executed twice.\n        // The real click event will bubble up, and the generated click event also tries to bubble up.\n        // This will lead to multiple click events.\n        // Preventing bubbling for the second event will solve that issue.\n        event.stopPropagation();\n    }\n    /**\n     * Triggered when the radio button received a click or the input recognized any change.\n     * Clicking on a label element, will trigger a change event on the associated input.\n     */\n    _onInputChange(event) {\n        // We always have to stop propagation on the change event.\n        // Otherwise the change event, from the input element, will bubble up and\n        // emit its event object to the `change` output.\n        event.stopPropagation();\n        const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;\n        this.checked = true;\n        this._emitChangeEvent();\n        if (this.radioGroup) {\n            this.radioGroup._controlValueAccessorChangeFn(this.value);\n            if (groupValueChanged) {\n                this.radioGroup._emitChangeEvent();\n            }\n        }\n    }\n    /** Sets the disabled state and marks for check if a change occurred. */\n    _setDisabled(value) {\n        if (this._disabled !== value) {\n            this._disabled = value;\n            this._changeDetector.markForCheck();\n        }\n    }\n}\n_MatRadioButtonBase.ɵfac = function _MatRadioButtonBase_Factory(t) { return new (t || _MatRadioButtonBase)(ɵngcc0.ɵɵdirectiveInject(_MatRadioGroupBase), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.UniqueSelectionDispatcher), ɵngcc0.ɵɵdirectiveInject(String), ɵngcc0.ɵɵdirectiveInject(undefined), ɵngcc0.ɵɵdirectiveInject(String)); };\n_MatRadioButtonBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatRadioButtonBase, viewQuery: function _MatRadioButtonBase_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(_c0, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._inputElement = _t.first);\n    } }, inputs: { id: \"id\", checked: \"checked\", value: \"value\", labelPosition: \"labelPosition\", disabled: \"disabled\", required: \"required\", color: \"color\", name: \"name\", ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], ariaDescribedby: [\"aria-describedby\", \"ariaDescribedby\"] }, outputs: { change: \"change\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n_MatRadioButtonBase.ctorParameters = () => [\n    { type: _MatRadioGroupBase },\n    { type: ElementRef },\n    { type: ChangeDetectorRef },\n    { type: FocusMonitor },\n    { type: UniqueSelectionDispatcher },\n    { type: String },\n    { type: undefined },\n    { type: String }\n];\n_MatRadioButtonBase.propDecorators = {\n    id: [{ type: Input }],\n    name: [{ type: Input }],\n    ariaLabel: [{ type: Input, args: ['aria-label',] }],\n    ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n    ariaDescribedby: [{ type: Input, args: ['aria-describedby',] }],\n    checked: [{ type: Input }],\n    value: [{ type: Input }],\n    labelPosition: [{ type: Input }],\n    disabled: [{ type: Input }],\n    required: [{ type: Input }],\n    color: [{ type: Input }],\n    change: [{ type: Output }],\n    _inputElement: [{ type: ViewChild, args: ['input',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatRadioButtonBase, [{\n        type: Directive\n    }], function () { return [{ type: _MatRadioGroupBase }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc2.UniqueSelectionDispatcher }, { type: String }, { type: undefined }, { type: String }]; }, { id: [{\n            type: Input\n        }], change: [{\n            type: Output\n        }], checked: [{\n            type: Input\n        }], value: [{\n            type: Input\n        }], labelPosition: [{\n            type: Input\n        }], disabled: [{\n            type: Input\n        }], required: [{\n            type: Input\n        }], color: [{\n            type: Input\n        }], name: [{\n            type: Input\n        }], ariaLabel: [{\n            type: Input,\n            args: ['aria-label']\n        }], ariaLabelledby: [{\n            type: Input,\n            args: ['aria-labelledby']\n        }], ariaDescribedby: [{\n            type: Input,\n            args: ['aria-describedby']\n        }], _inputElement: [{\n            type: ViewChild,\n            args: ['input']\n        }] }); })();\n/**\n * A Material design radio-button. Typically placed inside of `<mat-radio-group>` elements.\n */\nclass MatRadioButton extends _MatRadioButtonBase {\n    constructor(radioGroup, elementRef, changeDetector, focusMonitor, radioDispatcher, animationMode, providerOverride, tabIndex) {\n        super(radioGroup, elementRef, changeDetector, focusMonitor, radioDispatcher, animationMode, providerOverride, tabIndex);\n    }\n}\nMatRadioButton.ɵfac = function MatRadioButton_Factory(t) { return new (t || MatRadioButton)(ɵngcc0.ɵɵdirectiveInject(MAT_RADIO_GROUP, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.UniqueSelectionDispatcher), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵdirectiveInject(MAT_RADIO_DEFAULT_OPTIONS, 8), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatRadioButton.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatRadioButton, selectors: [[\"mat-radio-button\"]], hostAttrs: [1, \"mat-radio-button\"], hostVars: 17, hostBindings: function MatRadioButton_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"focus\", function MatRadioButton_focus_HostBindingHandler() { return ctx._inputElement.nativeElement.focus(); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"tabindex\", null)(\"id\", ctx.id)(\"aria-label\", null)(\"aria-labelledby\", null)(\"aria-describedby\", null);\n        ɵngcc0.ɵɵclassProp(\"mat-radio-checked\", ctx.checked)(\"mat-radio-disabled\", ctx.disabled)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-primary\", ctx.color === \"primary\")(\"mat-accent\", ctx.color === \"accent\")(\"mat-warn\", ctx.color === \"warn\");\n    } }, inputs: { disableRipple: \"disableRipple\", tabIndex: \"tabIndex\" }, exportAs: [\"matRadioButton\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c2, decls: 13, vars: 19, consts: [[1, \"mat-radio-label\"], [\"label\", \"\"], [1, \"mat-radio-container\"], [1, \"mat-radio-outer-circle\"], [1, \"mat-radio-inner-circle\"], [\"type\", \"radio\", 1, \"mat-radio-input\", \"cdk-visually-hidden\", 3, \"id\", \"checked\", \"disabled\", \"tabIndex\", \"required\", \"change\", \"click\"], [\"input\", \"\"], [\"mat-ripple\", \"\", 1, \"mat-radio-ripple\", \"mat-focus-indicator\", 3, \"matRippleTrigger\", \"matRippleDisabled\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\"], [1, \"mat-ripple-element\", \"mat-radio-persistent-ripple\"], [1, \"mat-radio-label-content\"], [2, \"display\", \"none\"]], template: function MatRadioButton_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵelementStart(0, \"label\", 0, 1);\n        ɵngcc0.ɵɵelementStart(2, \"span\", 2);\n        ɵngcc0.ɵɵelement(3, \"span\", 3);\n        ɵngcc0.ɵɵelement(4, \"span\", 4);\n        ɵngcc0.ɵɵelementStart(5, \"input\", 5, 6);\n        ɵngcc0.ɵɵlistener(\"change\", function MatRadioButton_Template_input_change_5_listener($event) { return ctx._onInputChange($event); })(\"click\", function MatRadioButton_Template_input_click_5_listener($event) { return ctx._onInputClick($event); });\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementStart(7, \"span\", 7);\n        ɵngcc0.ɵɵelement(8, \"span\", 8);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementStart(9, \"span\", 9);\n        ɵngcc0.ɵɵelementStart(10, \"span\", 10);\n        ɵngcc0.ɵɵtext(11, \"\\u00A0\");\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵprojection(12);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n    } if (rf & 2) {\n        const _r0 = ɵngcc0.ɵɵreference(1);\n        ɵngcc0.ɵɵattribute(\"for\", ctx.inputId);\n        ɵngcc0.ɵɵadvance(5);\n        ɵngcc0.ɵɵproperty(\"id\", ctx.inputId)(\"checked\", ctx.checked)(\"disabled\", ctx.disabled)(\"tabIndex\", ctx.tabIndex)(\"required\", ctx.required);\n        ɵngcc0.ɵɵattribute(\"name\", ctx.name)(\"value\", ctx.value)(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledby)(\"aria-describedby\", ctx.ariaDescribedby);\n        ɵngcc0.ɵɵadvance(2);\n        ɵngcc0.ɵɵproperty(\"matRippleTrigger\", _r0)(\"matRippleDisabled\", ctx._isRippleDisabled())(\"matRippleCentered\", true)(\"matRippleRadius\", 20)(\"matRippleAnimation\", ɵngcc0.ɵɵpureFunction0(18, _c1));\n        ɵngcc0.ɵɵadvance(2);\n        ɵngcc0.ɵɵclassProp(\"mat-radio-label-before\", ctx.labelPosition == \"before\");\n    } }, directives: [ɵngcc3.MatRipple], styles: [\".mat-radio-button{display:inline-block;-webkit-tap-highlight-color:transparent;outline:0}.mat-radio-label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;vertical-align:middle;width:100%}.mat-radio-container{box-sizing:border-box;display:inline-block;position:relative;width:20px;height:20px;flex-shrink:0}.mat-radio-outer-circle{box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:border-color ease 280ms;width:20px;border-width:2px;border-style:solid;border-radius:50%}._mat-animation-noopable .mat-radio-outer-circle{transition:none}.mat-radio-inner-circle{border-radius:50%;box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:transform ease 280ms,background-color ease 280ms;width:20px;transform:scale(0.001);-webkit-print-color-adjust:exact;color-adjust:exact}._mat-animation-noopable .mat-radio-inner-circle{transition:none}.mat-radio-checked .mat-radio-inner-circle{transform:scale(0.5)}.cdk-high-contrast-active .mat-radio-checked .mat-radio-inner-circle{border:solid 10px}.mat-radio-label-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;display:inline-block;order:0;line-height:inherit;padding-left:8px;padding-right:0}[dir=rtl] .mat-radio-label-content{padding-right:8px;padding-left:0}.mat-radio-label-content.mat-radio-label-before{order:-1;padding-left:0;padding-right:8px}[dir=rtl] .mat-radio-label-content.mat-radio-label-before{padding-right:0;padding-left:8px}.mat-radio-disabled,.mat-radio-disabled .mat-radio-label{cursor:default}.mat-radio-button .mat-radio-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-radio-button .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple){opacity:.16}.mat-radio-persistent-ripple{width:100%;height:100%;transform:none;top:0;left:0}.mat-radio-container:hover .mat-radio-persistent-ripple{opacity:.04}.mat-radio-button:not(.mat-radio-disabled).cdk-keyboard-focused .mat-radio-persistent-ripple,.mat-radio-button:not(.mat-radio-disabled).cdk-program-focused .mat-radio-persistent-ripple{opacity:.12}.mat-radio-persistent-ripple,.mat-radio-disabled .mat-radio-container:hover .mat-radio-persistent-ripple{opacity:0}@media(hover: none){.mat-radio-container:hover .mat-radio-persistent-ripple{display:none}}.mat-radio-input{bottom:0;left:50%}.cdk-high-contrast-active .mat-radio-disabled{opacity:.5}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatRadioButton.ctorParameters = () => [\n    { type: MatRadioGroup, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RADIO_GROUP,] }] },\n    { type: ElementRef },\n    { type: ChangeDetectorRef },\n    { type: FocusMonitor },\n    { type: UniqueSelectionDispatcher },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RADIO_DEFAULT_OPTIONS,] }] },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatRadioButton, [{\n        type: Component,\n        args: [{\n                selector: 'mat-radio-button',\n                template: \"<!-- TODO(jelbourn): render the radio on either side of the content -->\\n<!-- TODO(mtlin): Evaluate trade-offs of using native radio vs. cost of additional bindings. -->\\n<label [attr.for]=\\\"inputId\\\" class=\\\"mat-radio-label\\\" #label>\\n  <!-- The actual 'radio' part of the control. -->\\n  <span class=\\\"mat-radio-container\\\">\\n    <span class=\\\"mat-radio-outer-circle\\\"></span>\\n    <span class=\\\"mat-radio-inner-circle\\\"></span>\\n    <input #input class=\\\"mat-radio-input cdk-visually-hidden\\\" type=\\\"radio\\\"\\n        [id]=\\\"inputId\\\"\\n        [checked]=\\\"checked\\\"\\n        [disabled]=\\\"disabled\\\"\\n        [tabIndex]=\\\"tabIndex\\\"\\n        [attr.name]=\\\"name\\\"\\n        [attr.value]=\\\"value\\\"\\n        [required]=\\\"required\\\"\\n        [attr.aria-label]=\\\"ariaLabel\\\"\\n        [attr.aria-labelledby]=\\\"ariaLabelledby\\\"\\n        [attr.aria-describedby]=\\\"ariaDescribedby\\\"\\n        (change)=\\\"_onInputChange($event)\\\"\\n        (click)=\\\"_onInputClick($event)\\\">\\n\\n    <!-- The ripple comes after the input so that we can target it with a CSS\\n         sibling selector when the input is focused. -->\\n    <span mat-ripple class=\\\"mat-radio-ripple mat-focus-indicator\\\"\\n         [matRippleTrigger]=\\\"label\\\"\\n         [matRippleDisabled]=\\\"_isRippleDisabled()\\\"\\n         [matRippleCentered]=\\\"true\\\"\\n         [matRippleRadius]=\\\"20\\\"\\n         [matRippleAnimation]=\\\"{enterDuration: 150}\\\">\\n\\n      <span class=\\\"mat-ripple-element mat-radio-persistent-ripple\\\"></span>\\n    </span>\\n  </span>\\n\\n  <!-- The label content for radio control. -->\\n  <span class=\\\"mat-radio-label-content\\\" [class.mat-radio-label-before]=\\\"labelPosition == 'before'\\\">\\n    <!-- Add an invisible span so JAWS can read the label -->\\n    <span style=\\\"display:none\\\">&nbsp;</span>\\n    <ng-content></ng-content>\\n  </span>\\n</label>\\n\",\n                inputs: ['disableRipple', 'tabIndex'],\n                encapsulation: ViewEncapsulation.None,\n                exportAs: 'matRadioButton',\n                host: {\n                    'class': 'mat-radio-button',\n                    '[class.mat-radio-checked]': 'checked',\n                    '[class.mat-radio-disabled]': 'disabled',\n                    '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n                    '[class.mat-primary]': 'color === \"primary\"',\n                    '[class.mat-accent]': 'color === \"accent\"',\n                    '[class.mat-warn]': 'color === \"warn\"',\n                    // Needs to be removed since it causes some a11y issues (see #21266).\n                    '[attr.tabindex]': 'null',\n                    '[attr.id]': 'id',\n                    '[attr.aria-label]': 'null',\n                    '[attr.aria-labelledby]': 'null',\n                    '[attr.aria-describedby]': 'null',\n                    // Note: under normal conditions focus shouldn't land on this element, however it may be\n                    // programmatically set, for example inside of a focus trap, in this case we want to forward\n                    // the focus to the native element.\n                    '(focus)': '_inputElement.nativeElement.focus()'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                styles: [\".mat-radio-button{display:inline-block;-webkit-tap-highlight-color:transparent;outline:0}.mat-radio-label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;vertical-align:middle;width:100%}.mat-radio-container{box-sizing:border-box;display:inline-block;position:relative;width:20px;height:20px;flex-shrink:0}.mat-radio-outer-circle{box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:border-color ease 280ms;width:20px;border-width:2px;border-style:solid;border-radius:50%}._mat-animation-noopable .mat-radio-outer-circle{transition:none}.mat-radio-inner-circle{border-radius:50%;box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:transform ease 280ms,background-color ease 280ms;width:20px;transform:scale(0.001);-webkit-print-color-adjust:exact;color-adjust:exact}._mat-animation-noopable .mat-radio-inner-circle{transition:none}.mat-radio-checked .mat-radio-inner-circle{transform:scale(0.5)}.cdk-high-contrast-active .mat-radio-checked .mat-radio-inner-circle{border:solid 10px}.mat-radio-label-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;display:inline-block;order:0;line-height:inherit;padding-left:8px;padding-right:0}[dir=rtl] .mat-radio-label-content{padding-right:8px;padding-left:0}.mat-radio-label-content.mat-radio-label-before{order:-1;padding-left:0;padding-right:8px}[dir=rtl] .mat-radio-label-content.mat-radio-label-before{padding-right:0;padding-left:8px}.mat-radio-disabled,.mat-radio-disabled .mat-radio-label{cursor:default}.mat-radio-button .mat-radio-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-radio-button .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple){opacity:.16}.mat-radio-persistent-ripple{width:100%;height:100%;transform:none;top:0;left:0}.mat-radio-container:hover .mat-radio-persistent-ripple{opacity:.04}.mat-radio-button:not(.mat-radio-disabled).cdk-keyboard-focused .mat-radio-persistent-ripple,.mat-radio-button:not(.mat-radio-disabled).cdk-program-focused .mat-radio-persistent-ripple{opacity:.12}.mat-radio-persistent-ripple,.mat-radio-disabled .mat-radio-container:hover .mat-radio-persistent-ripple{opacity:0}@media(hover: none){.mat-radio-container:hover .mat-radio-persistent-ripple{display:none}}.mat-radio-input{bottom:0;left:50%}.cdk-high-contrast-active .mat-radio-disabled{opacity:.5}\\n\"]\n            }]\n    }], function () { return [{ type: MatRadioGroup, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_RADIO_GROUP]\n            }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc2.UniqueSelectionDispatcher }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_RADIO_DEFAULT_OPTIONS]\n            }] }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }]; }, null); })();\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 MatRadioModule {\n}\nMatRadioModule.ɵfac = function MatRadioModule_Factory(t) { return new (t || MatRadioModule)(); };\nMatRadioModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatRadioModule });\nMatRadioModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[MatRippleModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatRadioModule, [{\n        type: NgModule,\n        args: [{\n                imports: [MatRippleModule, MatCommonModule],\n                exports: [MatRadioGroup, MatRadioButton, MatCommonModule],\n                declarations: [MatRadioGroup, MatRadioButton]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatRadioModule, { declarations: function () { return [MatRadioGroup, MatRadioButton]; }, imports: function () { return [MatRippleModule, MatCommonModule]; }, exports: function () { return [MatRadioGroup, MatRadioButton, MatCommonModule]; } }); })();\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_RADIO_DEFAULT_OPTIONS, MAT_RADIO_DEFAULT_OPTIONS_FACTORY, MAT_RADIO_GROUP, MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR, MatRadioButton, MatRadioChange, MatRadioGroup, MatRadioModule, _MatRadioButtonBase, _MatRadioGroupBase };\n\n//# sourceMappingURL=radio.js.map","import { ObserversModule } from '@angular/cdk/observers';\nimport { InjectionToken, forwardRef, EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, Attribute, Inject, Optional, ViewChild, Input, Output, Directive, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinColor, mixinDisableRipple, mixinDisabled, MatRippleModule, MatCommonModule } from '@angular/material/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, CheckboxRequiredValidator } from '@angular/forms';\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/** Injection token to be used to override the default options for `mat-slide-toggle`. */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/material/core';\nimport * as ɵngcc3 from '@angular/cdk/observers';\n\nconst _c0 = [\"thumbContainer\"];\nconst _c1 = [\"toggleBar\"];\nconst _c2 = [\"input\"];\nconst _c3 = function () { return { enterDuration: 150 }; };\nconst _c4 = [\"*\"];\nconst MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS = new InjectionToken('mat-slide-toggle-default-options', {\n    providedIn: 'root',\n    factory: () => ({ disableToggleValue: false })\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 slide-toggle components.\nlet nextUniqueId = 0;\n/** @docs-private */\nconst MAT_SLIDE_TOGGLE_VALUE_ACCESSOR = {\n    provide: NG_VALUE_ACCESSOR,\n    useExisting: forwardRef(() => MatSlideToggle),\n    multi: true\n};\n/** Change event object emitted by a MatSlideToggle. */\nclass MatSlideToggleChange {\n    constructor(\n    /** The source MatSlideToggle of the event. */\n    source, \n    /** The new `checked` value of the MatSlideToggle. */\n    checked) {\n        this.source = source;\n        this.checked = checked;\n    }\n}\n// Boilerplate for applying mixins to MatSlideToggle.\n/** @docs-private */\nclass MatSlideToggleBase {\n    constructor(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n}\nconst _MatSlideToggleMixinBase = mixinTabIndex(mixinColor(mixinDisableRipple(mixinDisabled(MatSlideToggleBase)), 'accent'));\n/** Represents a slidable \"switch\" toggle that can be moved between on and off. */\nclass MatSlideToggle extends _MatSlideToggleMixinBase {\n    constructor(elementRef, _focusMonitor, _changeDetectorRef, tabIndex, defaults, _animationMode) {\n        super(elementRef);\n        this._focusMonitor = _focusMonitor;\n        this._changeDetectorRef = _changeDetectorRef;\n        this.defaults = defaults;\n        this._animationMode = _animationMode;\n        this._onChange = (_) => { };\n        this._onTouched = () => { };\n        this._uniqueId = `mat-slide-toggle-${++nextUniqueId}`;\n        this._required = false;\n        this._checked = false;\n        /** Name value will be applied to the input element if present. */\n        this.name = null;\n        /** A unique id for the slide-toggle input. If none is supplied, it will be auto-generated. */\n        this.id = this._uniqueId;\n        /** Whether the label should appear after or before the slide-toggle. Defaults to 'after'. */\n        this.labelPosition = 'after';\n        /** Used to set the aria-label attribute on the underlying input element. */\n        this.ariaLabel = null;\n        /** Used to set the aria-labelledby attribute on the underlying input element. */\n        this.ariaLabelledby = null;\n        /** An event will be dispatched each time the slide-toggle changes its value. */\n        this.change = new EventEmitter();\n        /**\n         * An event will be dispatched each time the slide-toggle input is toggled.\n         * This event is always emitted when the user toggles the slide toggle, but this does not mean\n         * the slide toggle's value has changed.\n         */\n        this.toggleChange = new EventEmitter();\n        this.tabIndex = parseInt(tabIndex) || 0;\n    }\n    /** Whether the slide-toggle is required. */\n    get required() { return this._required; }\n    set required(value) { this._required = coerceBooleanProperty(value); }\n    /** Whether the slide-toggle element is checked or not. */\n    get checked() { return this._checked; }\n    set checked(value) {\n        this._checked = coerceBooleanProperty(value);\n        this._changeDetectorRef.markForCheck();\n    }\n    /** Returns the unique id for the visual hidden input. */\n    get inputId() { return `${this.id || this._uniqueId}-input`; }\n    ngAfterContentInit() {\n        this._focusMonitor\n            .monitor(this._elementRef, true)\n            .subscribe(focusOrigin => {\n            // Only forward focus manually when it was received programmatically or through the\n            // keyboard. We should not do this for mouse/touch focus for two reasons:\n            // 1. It can prevent clicks from landing in Chrome (see #18269).\n            // 2. They're already handled by the wrapping `label` element.\n            if (focusOrigin === 'keyboard' || focusOrigin === 'program') {\n                this._inputElement.nativeElement.focus();\n            }\n            else if (!focusOrigin) {\n                // When a focused element becomes disabled, the browser *immediately* fires a blur event.\n                // Angular does not expect events to be raised during change detection, so any state\n                // change (such as a form control's 'ng-touched') will cause a changed-after-checked\n                // error. See https://github.com/angular/angular/issues/17793. To work around this,\n                // we defer telling the form control it has been touched until the next tick.\n                Promise.resolve().then(() => this._onTouched());\n            }\n        });\n    }\n    ngOnDestroy() {\n        this._focusMonitor.stopMonitoring(this._elementRef);\n    }\n    /** Method being called whenever the underlying input emits a change event. */\n    _onChangeEvent(event) {\n        // We always have to stop propagation on the change event.\n        // Otherwise the change event, from the input element, will bubble up and\n        // emit its event object to the component's `change` output.\n        event.stopPropagation();\n        this.toggleChange.emit();\n        // When the slide toggle's config disables toggle change event by setting\n        // `disableToggleValue: true`, the slide toggle's value does not change, and the\n        // checked state of the underlying input needs to be changed back.\n        if (this.defaults.disableToggleValue) {\n            this._inputElement.nativeElement.checked = this.checked;\n            return;\n        }\n        // Sync the value from the underlying input element with the component instance.\n        this.checked = this._inputElement.nativeElement.checked;\n        // Emit our custom change event only if the underlying input emitted one. This ensures that\n        // there is no change event, when the checked state changes programmatically.\n        this._emitChangeEvent();\n    }\n    /** Method being called whenever the slide-toggle has been clicked. */\n    _onInputClick(event) {\n        // We have to stop propagation for click events on the visual hidden input element.\n        // By default, when a user clicks on a label element, a generated click event will be\n        // dispatched on the associated input element. Since we are using a label element as our\n        // root container, the click event on the `slide-toggle` will be executed twice.\n        // The real click event will bubble up, and the generated click event also tries to bubble up.\n        // This will lead to multiple click events.\n        // Preventing bubbling for the second event will solve that issue.\n        event.stopPropagation();\n    }\n    /** Implemented as part of ControlValueAccessor. */\n    writeValue(value) {\n        this.checked = !!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 a part of ControlValueAccessor. */\n    setDisabledState(isDisabled) {\n        this.disabled = isDisabled;\n        this._changeDetectorRef.markForCheck();\n    }\n    /** Focuses the slide-toggle. */\n    focus(options, origin) {\n        if (origin) {\n            this._focusMonitor.focusVia(this._inputElement, origin, options);\n        }\n        else {\n            this._inputElement.nativeElement.focus(options);\n        }\n    }\n    /** Toggles the checked state of the slide-toggle. */\n    toggle() {\n        this.checked = !this.checked;\n        this._onChange(this.checked);\n    }\n    /**\n     * Emits a change event on the `change` output. Also notifies the FormControl about the change.\n     */\n    _emitChangeEvent() {\n        this._onChange(this.checked);\n        this.change.emit(new MatSlideToggleChange(this, this.checked));\n    }\n    /** Method being called whenever the label text changes. */\n    _onLabelTextChange() {\n        // Since the event of the `cdkObserveContent` directive runs outside of the zone, the\n        // slide-toggle component will be only marked for check, but no actual change detection runs\n        // automatically. Instead of going back into the zone in order to trigger a change detection\n        // which causes *all* components to be checked (if explicitly marked or not using OnPush),\n        // we only trigger an explicit change detection for the slide-toggle view and its children.\n        this._changeDetectorRef.detectChanges();\n    }\n}\nMatSlideToggle.ɵfac = function MatSlideToggle_Factory(t) { return new (t || MatSlideToggle)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵinjectAttribute('tabindex'), ɵngcc0.ɵɵdirectiveInject(MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatSlideToggle.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSlideToggle, selectors: [[\"mat-slide-toggle\"]], viewQuery: function MatSlideToggle_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(_c0, 5);\n        ɵngcc0.ɵɵviewQuery(_c1, 5);\n        ɵngcc0.ɵɵviewQuery(_c2, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._thumbEl = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._thumbBarEl = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._inputElement = _t.first);\n    } }, hostAttrs: [1, \"mat-slide-toggle\"], hostVars: 12, hostBindings: function MatSlideToggle_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵhostProperty(\"id\", ctx.id);\n        ɵngcc0.ɵɵattribute(\"tabindex\", ctx.disabled ? null : -1)(\"aria-label\", null)(\"aria-labelledby\", null);\n        ɵngcc0.ɵɵclassProp(\"mat-checked\", ctx.checked)(\"mat-disabled\", ctx.disabled)(\"mat-slide-toggle-label-before\", ctx.labelPosition == \"before\")(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\");\n    } }, inputs: { disabled: \"disabled\", disableRipple: \"disableRipple\", color: \"color\", tabIndex: \"tabIndex\", name: \"name\", id: \"id\", labelPosition: \"labelPosition\", ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], required: \"required\", checked: \"checked\" }, outputs: { change: \"change\", toggleChange: \"toggleChange\" }, exportAs: [\"matSlideToggle\"], features: [ɵngcc0.ɵɵProvidersFeature([MAT_SLIDE_TOGGLE_VALUE_ACCESSOR]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c4, decls: 16, vars: 18, consts: [[1, \"mat-slide-toggle-label\"], [\"label\", \"\"], [1, \"mat-slide-toggle-bar\"], [\"toggleBar\", \"\"], [\"type\", \"checkbox\", \"role\", \"switch\", 1, \"mat-slide-toggle-input\", \"cdk-visually-hidden\", 3, \"id\", \"required\", \"tabIndex\", \"checked\", \"disabled\", \"change\", \"click\"], [\"input\", \"\"], [1, \"mat-slide-toggle-thumb-container\"], [\"thumbContainer\", \"\"], [1, \"mat-slide-toggle-thumb\"], [\"mat-ripple\", \"\", 1, \"mat-slide-toggle-ripple\", \"mat-focus-indicator\", 3, \"matRippleTrigger\", \"matRippleDisabled\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\"], [1, \"mat-ripple-element\", \"mat-slide-toggle-persistent-ripple\"], [1, \"mat-slide-toggle-content\", 3, \"cdkObserveContent\"], [\"labelContent\", \"\"], [2, \"display\", \"none\"]], template: function MatSlideToggle_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵelementStart(0, \"label\", 0, 1);\n        ɵngcc0.ɵɵelementStart(2, \"div\", 2, 3);\n        ɵngcc0.ɵɵelementStart(4, \"input\", 4, 5);\n        ɵngcc0.ɵɵlistener(\"change\", function MatSlideToggle_Template_input_change_4_listener($event) { return ctx._onChangeEvent($event); })(\"click\", function MatSlideToggle_Template_input_click_4_listener($event) { return ctx._onInputClick($event); });\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementStart(6, \"div\", 6, 7);\n        ɵngcc0.ɵɵelement(8, \"div\", 8);\n        ɵngcc0.ɵɵelementStart(9, \"div\", 9);\n        ɵngcc0.ɵɵelement(10, \"div\", 10);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementStart(11, \"span\", 11, 12);\n        ɵngcc0.ɵɵlistener(\"cdkObserveContent\", function MatSlideToggle_Template_span_cdkObserveContent_11_listener() { return ctx._onLabelTextChange(); });\n        ɵngcc0.ɵɵelementStart(13, \"span\", 13);\n        ɵngcc0.ɵɵtext(14, \"\\u00A0\");\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵprojection(15);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n    } if (rf & 2) {\n        const _r0 = ɵngcc0.ɵɵreference(1);\n        const _r4 = ɵngcc0.ɵɵreference(12);\n        ɵngcc0.ɵɵattribute(\"for\", ctx.inputId);\n        ɵngcc0.ɵɵadvance(2);\n        ɵngcc0.ɵɵclassProp(\"mat-slide-toggle-bar-no-side-margin\", !_r4.textContent || !_r4.textContent.trim());\n        ɵngcc0.ɵɵadvance(2);\n        ɵngcc0.ɵɵproperty(\"id\", ctx.inputId)(\"required\", ctx.required)(\"tabIndex\", ctx.tabIndex)(\"checked\", ctx.checked)(\"disabled\", ctx.disabled);\n        ɵngcc0.ɵɵattribute(\"name\", ctx.name)(\"aria-checked\", ctx.checked.toString())(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledby);\n        ɵngcc0.ɵɵadvance(5);\n        ɵngcc0.ɵɵproperty(\"matRippleTrigger\", _r0)(\"matRippleDisabled\", ctx.disableRipple || ctx.disabled)(\"matRippleCentered\", true)(\"matRippleRadius\", 20)(\"matRippleAnimation\", ɵngcc0.ɵɵpureFunction0(17, _c3));\n    } }, directives: [ɵngcc2.MatRipple, ɵngcc3.CdkObserveContent], styles: [\".mat-slide-toggle{display:inline-block;height:24px;max-width:100%;line-height:24px;white-space:nowrap;outline:none;-webkit-tap-highlight-color:transparent}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(16px, 0, 0)}[dir=rtl] .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(-16px, 0, 0)}.mat-slide-toggle.mat-disabled{opacity:.38}.mat-slide-toggle.mat-disabled .mat-slide-toggle-label,.mat-slide-toggle.mat-disabled .mat-slide-toggle-thumb-container{cursor:default}.mat-slide-toggle-label{display:flex;flex:1;flex-direction:row;align-items:center;height:inherit;cursor:pointer}.mat-slide-toggle-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-slide-toggle-label-before .mat-slide-toggle-label{order:1}.mat-slide-toggle-label-before .mat-slide-toggle-bar{order:2}[dir=rtl] .mat-slide-toggle-label-before .mat-slide-toggle-bar,.mat-slide-toggle-bar{margin-right:8px;margin-left:0}[dir=rtl] .mat-slide-toggle-bar,.mat-slide-toggle-label-before .mat-slide-toggle-bar{margin-left:8px;margin-right:0}.mat-slide-toggle-bar-no-side-margin{margin-left:0;margin-right:0}.mat-slide-toggle-thumb-container{position:absolute;z-index:1;width:20px;height:20px;top:-3px;left:0;transform:translate3d(0, 0, 0);transition:all 80ms linear;transition-property:transform}._mat-animation-noopable .mat-slide-toggle-thumb-container{transition:none}[dir=rtl] .mat-slide-toggle-thumb-container{left:auto;right:0}.mat-slide-toggle-thumb{height:20px;width:20px;border-radius:50%}.mat-slide-toggle-bar{position:relative;width:36px;height:14px;flex-shrink:0;border-radius:8px}.mat-slide-toggle-input{bottom:0;left:10px}[dir=rtl] .mat-slide-toggle-input{left:auto;right:10px}.mat-slide-toggle-bar,.mat-slide-toggle-thumb{transition:all 80ms linear;transition-property:background-color;transition-delay:50ms}._mat-animation-noopable .mat-slide-toggle-bar,._mat-animation-noopable .mat-slide-toggle-thumb{transition:none}.mat-slide-toggle .mat-slide-toggle-ripple{position:absolute;top:calc(50% - 20px);left:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-slide-toggle .mat-slide-toggle-ripple .mat-ripple-element:not(.mat-slide-toggle-persistent-ripple){opacity:.12}.mat-slide-toggle-persistent-ripple{width:100%;height:100%;transform:none}.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:.04}.mat-slide-toggle:not(.mat-disabled).cdk-keyboard-focused .mat-slide-toggle-persistent-ripple{opacity:.12}.mat-slide-toggle-persistent-ripple,.mat-slide-toggle.mat-disabled .mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:0}@media(hover: none){.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{display:none}}.cdk-high-contrast-active .mat-slide-toggle-thumb,.cdk-high-contrast-active .mat-slide-toggle-bar{border:1px solid}.cdk-high-contrast-active .mat-slide-toggle.cdk-keyboard-focused .mat-slide-toggle-bar{outline:2px dotted;outline-offset:5px}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatSlideToggle.ctorParameters = () => [\n    { type: ElementRef },\n    { type: FocusMonitor },\n    { type: ChangeDetectorRef },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS,] }] },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatSlideToggle.propDecorators = {\n    _thumbEl: [{ type: ViewChild, args: ['thumbContainer',] }],\n    _thumbBarEl: [{ type: ViewChild, args: ['toggleBar',] }],\n    name: [{ type: Input }],\n    id: [{ type: Input }],\n    labelPosition: [{ type: Input }],\n    ariaLabel: [{ type: Input, args: ['aria-label',] }],\n    ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n    required: [{ type: Input }],\n    checked: [{ type: Input }],\n    change: [{ type: Output }],\n    toggleChange: [{ type: Output }],\n    _inputElement: [{ type: ViewChild, args: ['input',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlideToggle, [{\n        type: Component,\n        args: [{\n                selector: 'mat-slide-toggle',\n                exportAs: 'matSlideToggle',\n                host: {\n                    'class': 'mat-slide-toggle',\n                    '[id]': 'id',\n                    // Needs to be `-1` so it can still receive programmatic focus.\n                    '[attr.tabindex]': 'disabled ? null : -1',\n                    '[attr.aria-label]': 'null',\n                    '[attr.aria-labelledby]': 'null',\n                    '[class.mat-checked]': 'checked',\n                    '[class.mat-disabled]': 'disabled',\n                    '[class.mat-slide-toggle-label-before]': 'labelPosition == \"before\"',\n                    '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"'\n                },\n                template: \"<label [attr.for]=\\\"inputId\\\" class=\\\"mat-slide-toggle-label\\\" #label>\\n  <div #toggleBar class=\\\"mat-slide-toggle-bar\\\"\\n       [class.mat-slide-toggle-bar-no-side-margin]=\\\"!labelContent.textContent || !labelContent.textContent.trim()\\\">\\n\\n    <input #input class=\\\"mat-slide-toggle-input cdk-visually-hidden\\\" type=\\\"checkbox\\\"\\n           role=\\\"switch\\\"\\n           [id]=\\\"inputId\\\"\\n           [required]=\\\"required\\\"\\n           [tabIndex]=\\\"tabIndex\\\"\\n           [checked]=\\\"checked\\\"\\n           [disabled]=\\\"disabled\\\"\\n           [attr.name]=\\\"name\\\"\\n           [attr.aria-checked]=\\\"checked.toString()\\\"\\n           [attr.aria-label]=\\\"ariaLabel\\\"\\n           [attr.aria-labelledby]=\\\"ariaLabelledby\\\"\\n           (change)=\\\"_onChangeEvent($event)\\\"\\n           (click)=\\\"_onInputClick($event)\\\">\\n\\n    <div class=\\\"mat-slide-toggle-thumb-container\\\" #thumbContainer>\\n      <div class=\\\"mat-slide-toggle-thumb\\\"></div>\\n      <div class=\\\"mat-slide-toggle-ripple mat-focus-indicator\\\" mat-ripple\\n           [matRippleTrigger]=\\\"label\\\"\\n           [matRippleDisabled]=\\\"disableRipple || disabled\\\"\\n           [matRippleCentered]=\\\"true\\\"\\n           [matRippleRadius]=\\\"20\\\"\\n           [matRippleAnimation]=\\\"{enterDuration: 150}\\\">\\n\\n        <div class=\\\"mat-ripple-element mat-slide-toggle-persistent-ripple\\\"></div>\\n      </div>\\n    </div>\\n\\n  </div>\\n\\n  <span class=\\\"mat-slide-toggle-content\\\" #labelContent (cdkObserveContent)=\\\"_onLabelTextChange()\\\">\\n    <!-- Add an invisible span so JAWS can read the label -->\\n    <span style=\\\"display:none\\\">&nbsp;</span>\\n    <ng-content></ng-content>\\n  </span>\\n</label>\\n\",\n                providers: [MAT_SLIDE_TOGGLE_VALUE_ACCESSOR],\n                inputs: ['disabled', 'disableRipple', 'color', 'tabIndex'],\n                encapsulation: ViewEncapsulation.None,\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                styles: [\".mat-slide-toggle{display:inline-block;height:24px;max-width:100%;line-height:24px;white-space:nowrap;outline:none;-webkit-tap-highlight-color:transparent}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(16px, 0, 0)}[dir=rtl] .mat-slide-toggle.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(-16px, 0, 0)}.mat-slide-toggle.mat-disabled{opacity:.38}.mat-slide-toggle.mat-disabled .mat-slide-toggle-label,.mat-slide-toggle.mat-disabled .mat-slide-toggle-thumb-container{cursor:default}.mat-slide-toggle-label{display:flex;flex:1;flex-direction:row;align-items:center;height:inherit;cursor:pointer}.mat-slide-toggle-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-slide-toggle-label-before .mat-slide-toggle-label{order:1}.mat-slide-toggle-label-before .mat-slide-toggle-bar{order:2}[dir=rtl] .mat-slide-toggle-label-before .mat-slide-toggle-bar,.mat-slide-toggle-bar{margin-right:8px;margin-left:0}[dir=rtl] .mat-slide-toggle-bar,.mat-slide-toggle-label-before .mat-slide-toggle-bar{margin-left:8px;margin-right:0}.mat-slide-toggle-bar-no-side-margin{margin-left:0;margin-right:0}.mat-slide-toggle-thumb-container{position:absolute;z-index:1;width:20px;height:20px;top:-3px;left:0;transform:translate3d(0, 0, 0);transition:all 80ms linear;transition-property:transform}._mat-animation-noopable .mat-slide-toggle-thumb-container{transition:none}[dir=rtl] .mat-slide-toggle-thumb-container{left:auto;right:0}.mat-slide-toggle-thumb{height:20px;width:20px;border-radius:50%}.mat-slide-toggle-bar{position:relative;width:36px;height:14px;flex-shrink:0;border-radius:8px}.mat-slide-toggle-input{bottom:0;left:10px}[dir=rtl] .mat-slide-toggle-input{left:auto;right:10px}.mat-slide-toggle-bar,.mat-slide-toggle-thumb{transition:all 80ms linear;transition-property:background-color;transition-delay:50ms}._mat-animation-noopable .mat-slide-toggle-bar,._mat-animation-noopable .mat-slide-toggle-thumb{transition:none}.mat-slide-toggle .mat-slide-toggle-ripple{position:absolute;top:calc(50% - 20px);left:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-slide-toggle .mat-slide-toggle-ripple .mat-ripple-element:not(.mat-slide-toggle-persistent-ripple){opacity:.12}.mat-slide-toggle-persistent-ripple{width:100%;height:100%;transform:none}.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:.04}.mat-slide-toggle:not(.mat-disabled).cdk-keyboard-focused .mat-slide-toggle-persistent-ripple{opacity:.12}.mat-slide-toggle-persistent-ripple,.mat-slide-toggle.mat-disabled .mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{opacity:0}@media(hover: none){.mat-slide-toggle-bar:hover .mat-slide-toggle-persistent-ripple{display:none}}.cdk-high-contrast-active .mat-slide-toggle-thumb,.cdk-high-contrast-active .mat-slide-toggle-bar{border:1px solid}.cdk-high-contrast-active .mat-slide-toggle.cdk-keyboard-focused .mat-slide-toggle-bar{outline:2px dotted;outline-offset:5px}\\n\"]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc0.ChangeDetectorRef }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS]\n            }] }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }]; }, { name: [{\n            type: Input\n        }], id: [{\n            type: Input\n        }], labelPosition: [{\n            type: Input\n        }], ariaLabel: [{\n            type: Input,\n            args: ['aria-label']\n        }], ariaLabelledby: [{\n            type: Input,\n            args: ['aria-labelledby']\n        }], change: [{\n            type: Output\n        }], toggleChange: [{\n            type: Output\n        }], required: [{\n            type: Input\n        }], checked: [{\n            type: Input\n        }], _thumbEl: [{\n            type: ViewChild,\n            args: ['thumbContainer']\n        }], _thumbBarEl: [{\n            type: ViewChild,\n            args: ['toggleBar']\n        }], _inputElement: [{\n            type: ViewChild,\n            args: ['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 MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR = {\n    provide: NG_VALIDATORS,\n    useExisting: forwardRef(() => MatSlideToggleRequiredValidator),\n    multi: true\n};\n/**\n * Validator for Material slide-toggle components with the required attribute in a\n * template-driven form. The default validator for required form controls asserts\n * that the control value is not undefined but that is not appropriate for a slide-toggle\n * where the value is always defined.\n *\n * Required slide-toggle form controls are valid when checked.\n */\nclass MatSlideToggleRequiredValidator extends CheckboxRequiredValidator {\n}\nMatSlideToggleRequiredValidator.ɵfac = /*@__PURE__*/ function () { let ɵMatSlideToggleRequiredValidator_BaseFactory; return function MatSlideToggleRequiredValidator_Factory(t) { return (ɵMatSlideToggleRequiredValidator_BaseFactory || (ɵMatSlideToggleRequiredValidator_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatSlideToggleRequiredValidator)))(t || MatSlideToggleRequiredValidator); }; }();\nMatSlideToggleRequiredValidator.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatSlideToggleRequiredValidator, selectors: [[\"mat-slide-toggle\", \"required\", \"\", \"formControlName\", \"\"], [\"mat-slide-toggle\", \"required\", \"\", \"formControl\", \"\"], [\"mat-slide-toggle\", \"required\", \"\", \"ngModel\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR]), ɵngcc0.ɵɵInheritDefinitionFeature] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlideToggleRequiredValidator, [{\n        type: Directive,\n        args: [{\n                selector: `mat-slide-toggle[required][formControlName],\n             mat-slide-toggle[required][formControl], mat-slide-toggle[required][ngModel]`,\n                providers: [MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR]\n            }]\n    }], null, null); })();\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/** This module is used by both original and MDC-based slide-toggle implementations. */\nclass _MatSlideToggleRequiredValidatorModule {\n}\n_MatSlideToggleRequiredValidatorModule.ɵfac = function _MatSlideToggleRequiredValidatorModule_Factory(t) { return new (t || _MatSlideToggleRequiredValidatorModule)(); };\n_MatSlideToggleRequiredValidatorModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: _MatSlideToggleRequiredValidatorModule });\n_MatSlideToggleRequiredValidatorModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({});\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatSlideToggleRequiredValidatorModule, [{\n        type: NgModule,\n        args: [{\n                exports: [MatSlideToggleRequiredValidator],\n                declarations: [MatSlideToggleRequiredValidator]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(_MatSlideToggleRequiredValidatorModule, { declarations: [MatSlideToggleRequiredValidator], exports: [MatSlideToggleRequiredValidator] }); })();\nclass MatSlideToggleModule {\n}\nMatSlideToggleModule.ɵfac = function MatSlideToggleModule_Factory(t) { return new (t || MatSlideToggleModule)(); };\nMatSlideToggleModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatSlideToggleModule });\nMatSlideToggleModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[\n            _MatSlideToggleRequiredValidatorModule,\n            MatRippleModule,\n            MatCommonModule,\n            ObserversModule,\n        ], _MatSlideToggleRequiredValidatorModule, MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSlideToggleModule, [{\n        type: NgModule,\n        args: [{\n                imports: [\n                    _MatSlideToggleRequiredValidatorModule,\n                    MatRippleModule,\n                    MatCommonModule,\n                    ObserversModule,\n                ],\n                exports: [\n                    _MatSlideToggleRequiredValidatorModule,\n                    MatSlideToggle,\n                    MatCommonModule\n                ],\n                declarations: [MatSlideToggle]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSlideToggleModule, { declarations: function () { return [MatSlideToggle]; }, imports: function () { return [_MatSlideToggleRequiredValidatorModule, MatRippleModule,\n        MatCommonModule,\n        ObserversModule]; }, exports: function () { return [_MatSlideToggleRequiredValidatorModule, MatSlideToggle, MatCommonModule]; } }); })();\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_SLIDE_TOGGLE_DEFAULT_OPTIONS, MAT_SLIDE_TOGGLE_REQUIRED_VALIDATOR, MAT_SLIDE_TOGGLE_VALUE_ACCESSOR, MatSlideToggle, MatSlideToggleChange, MatSlideToggleModule, MatSlideToggleRequiredValidator, _MatSlideToggleRequiredValidatorModule };\n\n//# sourceMappingURL=slide-toggle.js.map","(function (root, factory) {\n  if (root === undefined && window !== undefined) root = window;\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define([\"chartist\"], function (a0) {\n      return (root['Chartist.plugins.tooltip'] = factory(a0));\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory(require(\"chartist\"));\n  } else {\n    root['Chartist.plugins.tooltip'] = factory(root[\"Chartist\"]);\n  }\n}(this, function (Chartist) {\n\n/**\r\n * Chartist.js plugin to display a data label on top of the points in a line chart.\r\n *\r\n */\r\n/* global Chartist */\r\n(function (window, document, Chartist) {\r\n  'use strict';\r\n\r\n  var defaultOptions = {\r\n    currency: undefined,\r\n    currencyFormatCallback: undefined,\r\n    tooltipOffset: {\r\n      x: 0,\r\n      y: -20,\r\n    },\r\n    anchorToPoint: false,\r\n    appendToBody: true,\r\n    class: undefined,\r\n    pointClass: 'ct-point',\r\n  };\r\n\r\n  Chartist.plugins = Chartist.plugins || {};\r\n  Chartist.plugins.tooltip = function (options) {\r\n    options = Chartist.extend({}, defaultOptions, options);\r\n\r\n    return function tooltip(chart) {\r\n      // Warning: If you are using npm link or yarn link, these instanceof checks will fail and you won't any tooltips\r\n      var tooltipSelector = options.pointClass;\r\n      if (chart instanceof Chartist.Bar) {\r\n        tooltipSelector = 'ct-bar';\r\n      } else if (chart instanceof Chartist.Pie) {\r\n        // Added support for donut graph\r\n        if (chart.options.donut) {\r\n          // Added support for the solid donut graph\r\n          tooltipSelector = chart.options.donutSolid ? 'ct-slice-donut-solid' : 'ct-slice-donut';\r\n        } else {\r\n          tooltipSelector = 'ct-slice-pie';\r\n        }\r\n      }\r\n\r\n      var $chart = chart.container;\r\n      var $toolTipIsShown = false;\r\n      var $tooltipOffsetParent = offsetParent($chart);\r\n      var $toolTip;\r\n\r\n      if (!options.appendToBody) {\r\n        // searching for existing tooltip in the chart, because appendToBody is disabled\r\n        $toolTip = $chart.querySelector('.chartist-tooltip');\r\n      } else {\r\n        // searching for existing tooltip in the body, because appendToBody is enabled\r\n        $toolTip = document.querySelector('.chartist-tooltip');\r\n      }\r\n      if (!$toolTip) {\r\n        $toolTip = document.createElement('div');\r\n        $toolTip.className = (!options.class) ? 'chartist-tooltip' : 'chartist-tooltip ' + options.class;\r\n        if (!options.appendToBody) {\r\n          $chart.appendChild($toolTip);\r\n        } else {\r\n          document.body.appendChild($toolTip);\r\n        }\r\n      }\r\n      var height = $toolTip.offsetHeight;\r\n      var width = $toolTip.offsetWidth;\r\n\r\n      hide($toolTip);\r\n\r\n      function on(event, selector, callback) {\r\n        $chart.addEventListener(event, function (e) {\r\n          if (!selector || hasClass(e.target, selector))\r\n            callback(e);\r\n        });\r\n      }\r\n\r\n      on('mouseover', tooltipSelector, function (event) {\r\n        var $point = event.target;\r\n        var tooltipText = '';\r\n\r\n        var isPieChart = (chart instanceof Chartist.Pie) ? $point : $point.parentNode;\r\n        var seriesName = (isPieChart) ? $point.parentNode.getAttribute('ct:meta') || $point.parentNode.getAttribute('ct:series-name') : '';\r\n        var meta = $point.getAttribute('ct:meta') || seriesName || '';\r\n        var hasMeta = !!meta;\r\n        var value = $point.getAttribute('ct:value');\r\n\r\n        if (options.transformTooltipTextFnc && typeof options.transformTooltipTextFnc === 'function') {\r\n          value = options.transformTooltipTextFnc(value);\r\n        }\r\n\r\n        if (options.tooltipFnc && typeof options.tooltipFnc === 'function') {\r\n          tooltipText = options.tooltipFnc(meta, value);\r\n        } else {\r\n          if (options.metaIsHTML) {\r\n            var txt = document.createElement('textarea');\r\n            txt.innerHTML = meta;\r\n            meta = txt.value;\r\n          }\r\n\r\n          meta = '<span class=\"chartist-tooltip-meta\">' + meta + '</span>';\r\n\r\n          if (hasMeta) {\r\n            tooltipText += meta + '<br>';\r\n          } else {\r\n            // For Pie Charts also take the labels into account\r\n            // Could add support for more charts here as well!\r\n            if (chart instanceof Chartist.Pie) {\r\n              var label = next($point, 'ct-label');\r\n              if (label) {\r\n                tooltipText += text(label) + '<br>';\r\n              }\r\n            }\r\n          }\r\n\r\n          if (value) {\r\n            if (options.currency) {\r\n              if (options.currencyFormatCallback != undefined) {\r\n                value = options.currencyFormatCallback(value, options);\r\n              } else {\r\n                value = options.currency + value.replace(/(\\d)(?=(\\d{3})+(?:\\.\\d+)?$)/g, '$1,');\r\n              }\r\n            }\r\n            value = '<span class=\"chartist-tooltip-value\">' + value + '</span>';\r\n            tooltipText += value;\r\n          }\r\n        }\r\n\r\n        if (tooltipText) {\r\n          $toolTip.innerHTML = tooltipText;\r\n\r\n          // Calculate new width and height, as toolTip width/height may have changed with innerHTML change\r\n          height = $toolTip.offsetHeight;\r\n          width = $toolTip.offsetWidth;\r\n\r\n          if (options.appendToBody !== true) {\r\n            $tooltipOffsetParent = offsetParent($chart);\r\n          }\r\n          if ($toolTip.style.display !== 'absolute') {\r\n            $toolTip.style.display = 'absolute';\r\n          }\r\n          setPosition(event);\r\n          show($toolTip);\r\n\r\n          // Remember height and width to avoid wrong position in IE\r\n          height = $toolTip.offsetHeight;\r\n          width = $toolTip.offsetWidth;\r\n        }\r\n      });\r\n\r\n      on('mouseout', tooltipSelector, function () {\r\n        hide($toolTip);\r\n      });\r\n\r\n      on('mousemove', null, function (event) {\r\n        if (options.anchorToPoint === false && $toolTipIsShown) {\r\n          setPosition(event);\r\n        }\r\n      });\r\n\r\n      function setPosition(event) {\r\n        height = height || $toolTip.offsetHeight;\r\n        width = width || $toolTip.offsetWidth;\r\n        var offsetX = -width / 2 + options.tooltipOffset.x;\r\n        var offsetY = -height + options.tooltipOffset.y;\r\n\r\n        var anchor = options.anchorToPoint === true && event.target.x2 && event.target.y2;\r\n\r\n        if (options.appendToBody === true) {\r\n          if (anchor) {\r\n            var box = $chart.getBoundingClientRect();\r\n            var left = event.target.x2.baseVal.value + box.left + window.pageXOffset;\r\n            var top = event.target.y2.baseVal.value + box.top + window.pageYOffset;\r\n\r\n            $toolTip.style.left = left + offsetX + 'px';\r\n            $toolTip.style.top = top + offsetY + 'px';\r\n          } else {\r\n            $toolTip.style.left = event.pageX + offsetX + 'px';\r\n            $toolTip.style.top = event.pageY + offsetY + 'px';\r\n          }\r\n        } else {\r\n          var offsetBox = $tooltipOffsetParent.getBoundingClientRect();\r\n          var allOffsetLeft = -offsetBox.left - window.pageXOffset + offsetX;\r\n          var allOffsetTop = -offsetBox.top - window.pageYOffset + offsetY;\r\n\r\n          if (anchor) {\r\n            var box = $chart.getBoundingClientRect();\r\n            var left = event.target.x2.baseVal.value + box.left + window.pageXOffset;\r\n            var top = event.target.y2.baseVal.value + box.top + window.pageYOffset;\r\n\r\n            $toolTip.style.left = left + allOffsetLeft + 'px';\r\n            $toolTip.style.top = top + allOffsetTop + 'px';\r\n          } else {\r\n            $toolTip.style.left = event.pageX + allOffsetLeft + 'px';\r\n            $toolTip.style.top = event.pageY + allOffsetTop + 'px';\r\n          }\r\n        }\r\n      }\r\n\r\n      /**\r\n       * Shows the tooltip element, if not shown\r\n       * @param element\r\n       */\r\n      function show(element) {\r\n        $toolTipIsShown = true;\r\n        if (!hasClass(element, 'tooltip-show')) {\r\n          element.className = element.className + ' tooltip-show';\r\n        }\r\n      }\r\n\r\n      /**\r\n       * Hides the tooltip element\r\n       * @param element\r\n       */\r\n      function hide(element) {\r\n        $toolTipIsShown = false;\r\n        var regex = new RegExp('tooltip-show' + '\\\\s*', 'gi');\r\n        element.className = element.className.replace(regex, '').trim();\r\n      }\r\n\r\n    };\r\n  };\r\n\r\n  /**\r\n   * Returns whether a element has a css class called className\r\n   * @param element\r\n   * @param className\r\n   * @return {boolean}\r\n   */\r\n  function hasClass(element, className) {\r\n    return (' ' + element.getAttribute('class') + ' ').indexOf(' ' + className + ' ') > -1;\r\n  }\r\n\r\n  function next(element, className) {\r\n    do {\r\n      element = element.nextSibling;\r\n    } while (element && !hasClass(element, className));\r\n    return element;\r\n  }\r\n\r\n  /**\r\n   *\r\n   * @param element\r\n   * @return {string | string}\r\n   */\r\n  function text(element) {\r\n    return element.innerText || element.textContent;\r\n  }\r\n\r\n  /**\r\n   * Returns the first positioned parent of the element\r\n   * @return HTMLElement\r\n   */\r\n  function offsetParent(elem) {\r\n    if (offsetParent in elem) {\r\n      // Using the native property if possible\r\n      var parent = elem.offsetParent;\r\n\r\n      if (!parent) {\r\n        parent = document.body.parentElement;\r\n      }\r\n\r\n      return parent;\r\n    }\r\n\r\n    var parent = elem.parentNode;\r\n    if (!parent) {\r\n      return document.body.parentElement;\r\n    }\r\n\r\n    if (window.getComputedStyle(parent).position !== 'static') {\r\n      return parent;\r\n    } else if (parent.tagName === 'BODY') {\r\n      return parent.parentElement;\r\n    } else {\r\n      return offsetParent(parent);\r\n    }\r\n  }\r\n\r\n}(window, document, Chartist));\r\n\nreturn Chartist.plugins.tooltip;\n\n}));\n","(function (root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module unless amdModuleId is set\n    define('Chartist', [], function () {\n      return (root['Chartist'] = factory());\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like environments that support module.exports,\n    // like Node.\n    module.exports = factory();\n  } else {\n    root['Chartist'] = factory();\n  }\n}(this, function () {\n\n/* Chartist.js 0.11.4\n * Copyright © 2019 Gion Kunz\n * Free to use under either the WTFPL license or the MIT license.\n * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-WTFPL\n * https://raw.githubusercontent.com/gionkunz/chartist-js/master/LICENSE-MIT\n */\n/**\n * The core module of Chartist that is mainly providing static functions and higher level functions for chart modules.\n *\n * @module Chartist.Core\n */\nvar Chartist = {\n  version: '0.11.4'\n};\n\n(function (globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  /**\n   * This object contains all namespaces used within Chartist.\n   *\n   * @memberof Chartist.Core\n   * @type {{svg: string, xmlns: string, xhtml: string, xlink: string, ct: string}}\n   */\n  Chartist.namespaces = {\n    svg: 'http://www.w3.org/2000/svg',\n    xmlns: 'http://www.w3.org/2000/xmlns/',\n    xhtml: 'http://www.w3.org/1999/xhtml',\n    xlink: 'http://www.w3.org/1999/xlink',\n    ct: 'http://gionkunz.github.com/chartist-js/ct'\n  };\n\n  /**\n   * Helps to simplify functional style code\n   *\n   * @memberof Chartist.Core\n   * @param {*} n This exact value will be returned by the noop function\n   * @return {*} The same value that was provided to the n parameter\n   */\n  Chartist.noop = function (n) {\n    return n;\n  };\n\n  /**\n   * Generates a-z from a number 0 to 26\n   *\n   * @memberof Chartist.Core\n   * @param {Number} n A number from 0 to 26 that will result in a letter a-z\n   * @return {String} A character from a-z based on the input number n\n   */\n  Chartist.alphaNumerate = function (n) {\n    // Limit to a-z\n    return String.fromCharCode(97 + n % 26);\n  };\n\n  /**\n   * Simple recursive object extend\n   *\n   * @memberof Chartist.Core\n   * @param {Object} target Target object where the source will be merged into\n   * @param {Object...} sources This object (objects) will be merged into target and then target is returned\n   * @return {Object} An object that has the same reference as target but is extended and merged with the properties of source\n   */\n  Chartist.extend = function (target) {\n    var i, source, sourceProp;\n    target = target || {};\n\n    for (i = 1; i < arguments.length; i++) {\n      source = arguments[i];\n      for (var prop in source) {\n        sourceProp = source[prop];\n        if (typeof sourceProp === 'object' && sourceProp !== null && !(sourceProp instanceof Array)) {\n          target[prop] = Chartist.extend(target[prop], sourceProp);\n        } else {\n          target[prop] = sourceProp;\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Replaces all occurrences of subStr in str with newSubStr and returns a new string.\n   *\n   * @memberof Chartist.Core\n   * @param {String} str\n   * @param {String} subStr\n   * @param {String} newSubStr\n   * @return {String}\n   */\n  Chartist.replaceAll = function(str, subStr, newSubStr) {\n    return str.replace(new RegExp(subStr, 'g'), newSubStr);\n  };\n\n  /**\n   * Converts a number to a string with a unit. If a string is passed then this will be returned unmodified.\n   *\n   * @memberof Chartist.Core\n   * @param {Number} value\n   * @param {String} unit\n   * @return {String} Returns the passed number value with unit.\n   */\n  Chartist.ensureUnit = function(value, unit) {\n    if(typeof value === 'number') {\n      value = value + unit;\n    }\n\n    return value;\n  };\n\n  /**\n   * Converts a number or string to a quantity object.\n   *\n   * @memberof Chartist.Core\n   * @param {String|Number} input\n   * @return {Object} Returns an object containing the value as number and the unit as string.\n   */\n  Chartist.quantity = function(input) {\n    if (typeof input === 'string') {\n      var match = (/^(\\d+)\\s*(.*)$/g).exec(input);\n      return {\n        value : +match[1],\n        unit: match[2] || undefined\n      };\n    }\n    return { value: input };\n  };\n\n  /**\n   * This is a wrapper around document.querySelector that will return the query if it's already of type Node\n   *\n   * @memberof Chartist.Core\n   * @param {String|Node} query The query to use for selecting a Node or a DOM node that will be returned directly\n   * @return {Node}\n   */\n  Chartist.querySelector = function(query) {\n    return query instanceof Node ? query : document.querySelector(query);\n  };\n\n  /**\n   * Functional style helper to produce array with given length initialized with undefined values\n   *\n   * @memberof Chartist.Core\n   * @param length\n   * @return {Array}\n   */\n  Chartist.times = function(length) {\n    return Array.apply(null, new Array(length));\n  };\n\n  /**\n   * Sum helper to be used in reduce functions\n   *\n   * @memberof Chartist.Core\n   * @param previous\n   * @param current\n   * @return {*}\n   */\n  Chartist.sum = function(previous, current) {\n    return previous + (current ? current : 0);\n  };\n\n  /**\n   * Multiply helper to be used in `Array.map` for multiplying each value of an array with a factor.\n   *\n   * @memberof Chartist.Core\n   * @param {Number} factor\n   * @returns {Function} Function that can be used in `Array.map` to multiply each value in an array\n   */\n  Chartist.mapMultiply = function(factor) {\n    return function(num) {\n      return num * factor;\n    };\n  };\n\n  /**\n   * Add helper to be used in `Array.map` for adding a addend to each value of an array.\n   *\n   * @memberof Chartist.Core\n   * @param {Number} addend\n   * @returns {Function} Function that can be used in `Array.map` to add a addend to each value in an array\n   */\n  Chartist.mapAdd = function(addend) {\n    return function(num) {\n      return num + addend;\n    };\n  };\n\n  /**\n   * Map for multi dimensional arrays where their nested arrays will be mapped in serial. The output array will have the length of the largest nested array. The callback function is called with variable arguments where each argument is the nested array value (or undefined if there are no more values).\n   *\n   * @memberof Chartist.Core\n   * @param arr\n   * @param cb\n   * @return {Array}\n   */\n  Chartist.serialMap = function(arr, cb) {\n    var result = [],\n        length = Math.max.apply(null, arr.map(function(e) {\n          return e.length;\n        }));\n\n    Chartist.times(length).forEach(function(e, index) {\n      var args = arr.map(function(e) {\n        return e[index];\n      });\n\n      result[index] = cb.apply(null, args);\n    });\n\n    return result;\n  };\n\n  /**\n   * This helper function can be used to round values with certain precision level after decimal. This is used to prevent rounding errors near float point precision limit.\n   *\n   * @memberof Chartist.Core\n   * @param {Number} value The value that should be rounded with precision\n   * @param {Number} [digits] The number of digits after decimal used to do the rounding\n   * @returns {number} Rounded value\n   */\n  Chartist.roundWithPrecision = function(value, digits) {\n    var precision = Math.pow(10, digits || Chartist.precision);\n    return Math.round(value * precision) / precision;\n  };\n\n  /**\n   * Precision level used internally in Chartist for rounding. If you require more decimal places you can increase this number.\n   *\n   * @memberof Chartist.Core\n   * @type {number}\n   */\n  Chartist.precision = 8;\n\n  /**\n   * A map with characters to escape for strings to be safely used as attribute values.\n   *\n   * @memberof Chartist.Core\n   * @type {Object}\n   */\n  Chartist.escapingMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    '\\'': '&#039;'\n  };\n\n  /**\n   * This function serializes arbitrary data to a string. In case of data that can't be easily converted to a string, this function will create a wrapper object and serialize the data using JSON.stringify. The outcoming string will always be escaped using Chartist.escapingMap.\n   * If called with null or undefined the function will return immediately with null or undefined.\n   *\n   * @memberof Chartist.Core\n   * @param {Number|String|Object} data\n   * @return {String}\n   */\n  Chartist.serialize = function(data) {\n    if(data === null || data === undefined) {\n      return data;\n    } else if(typeof data === 'number') {\n      data = ''+data;\n    } else if(typeof data === 'object') {\n      data = JSON.stringify({data: data});\n    }\n\n    return Object.keys(Chartist.escapingMap).reduce(function(result, key) {\n      return Chartist.replaceAll(result, key, Chartist.escapingMap[key]);\n    }, data);\n  };\n\n  /**\n   * This function de-serializes a string previously serialized with Chartist.serialize. The string will always be unescaped using Chartist.escapingMap before it's returned. Based on the input value the return type can be Number, String or Object. JSON.parse is used with try / catch to see if the unescaped string can be parsed into an Object and this Object will be returned on success.\n   *\n   * @memberof Chartist.Core\n   * @param {String} data\n   * @return {String|Number|Object}\n   */\n  Chartist.deserialize = function(data) {\n    if(typeof data !== 'string') {\n      return data;\n    }\n\n    data = Object.keys(Chartist.escapingMap).reduce(function(result, key) {\n      return Chartist.replaceAll(result, Chartist.escapingMap[key], key);\n    }, data);\n\n    try {\n      data = JSON.parse(data);\n      data = data.data !== undefined ? data.data : data;\n    } catch(e) {}\n\n    return data;\n  };\n\n  /**\n   * Create or reinitialize the SVG element for the chart\n   *\n   * @memberof Chartist.Core\n   * @param {Node} container The containing DOM Node object that will be used to plant the SVG element\n   * @param {String} width Set the width of the SVG element. Default is 100%\n   * @param {String} height Set the height of the SVG element. Default is 100%\n   * @param {String} className Specify a class to be added to the SVG element\n   * @return {Object} The created/reinitialized SVG element\n   */\n  Chartist.createSvg = function (container, width, height, className) {\n    var svg;\n\n    width = width || '100%';\n    height = height || '100%';\n\n    // Check if there is a previous SVG element in the container that contains the Chartist XML namespace and remove it\n    // Since the DOM API does not support namespaces we need to manually search the returned list http://www.w3.org/TR/selectors-api/\n    Array.prototype.slice.call(container.querySelectorAll('svg')).filter(function filterChartistSvgObjects(svg) {\n      return svg.getAttributeNS(Chartist.namespaces.xmlns, 'ct');\n    }).forEach(function removePreviousElement(svg) {\n      container.removeChild(svg);\n    });\n\n    // Create svg object with width and height or use 100% as default\n    svg = new Chartist.Svg('svg').attr({\n      width: width,\n      height: height\n    }).addClass(className);\n\n    svg._node.style.width = width;\n    svg._node.style.height = height;\n\n    // Add the DOM node to our container\n    container.appendChild(svg._node);\n\n    return svg;\n  };\n\n  /**\n   * Ensures that the data object passed as second argument to the charts is present and correctly initialized.\n   *\n   * @param  {Object} data The data object that is passed as second argument to the charts\n   * @return {Object} The normalized data object\n   */\n  Chartist.normalizeData = function(data, reverse, multi) {\n    var labelCount;\n    var output = {\n      raw: data,\n      normalized: {}\n    };\n\n    // Check if we should generate some labels based on existing series data\n    output.normalized.series = Chartist.getDataArray({\n      series: data.series || []\n    }, reverse, multi);\n\n    // If all elements of the normalized data array are arrays we're dealing with\n    // multi series data and we need to find the largest series if they are un-even\n    if (output.normalized.series.every(function(value) {\n        return value instanceof Array;\n      })) {\n      // Getting the series with the the most elements\n      labelCount = Math.max.apply(null, output.normalized.series.map(function(series) {\n        return series.length;\n      }));\n    } else {\n      // We're dealing with Pie data so we just take the normalized array length\n      labelCount = output.normalized.series.length;\n    }\n\n    output.normalized.labels = (data.labels || []).slice();\n    // Padding the labels to labelCount with empty strings\n    Array.prototype.push.apply(\n      output.normalized.labels,\n      Chartist.times(Math.max(0, labelCount - output.normalized.labels.length)).map(function() {\n        return '';\n      })\n    );\n\n    if(reverse) {\n      Chartist.reverseData(output.normalized);\n    }\n\n    return output;\n  };\n\n  /**\n   * This function safely checks if an objects has an owned property.\n   *\n   * @param {Object} object The object where to check for a property\n   * @param {string} property The property name\n   * @returns {boolean} Returns true if the object owns the specified property\n   */\n  Chartist.safeHasProperty = function(object, property) {\n    return object !== null &&\n      typeof object === 'object' &&\n      object.hasOwnProperty(property);\n  };\n\n  /**\n   * Checks if a value is considered a hole in the data series.\n   *\n   * @param {*} value\n   * @returns {boolean} True if the value is considered a data hole\n   */\n  Chartist.isDataHoleValue = function(value) {\n    return value === null ||\n      value === undefined ||\n      (typeof value === 'number' && isNaN(value));\n  };\n\n  /**\n   * Reverses the series, labels and series data arrays.\n   *\n   * @memberof Chartist.Core\n   * @param data\n   */\n  Chartist.reverseData = function(data) {\n    data.labels.reverse();\n    data.series.reverse();\n    for (var i = 0; i < data.series.length; i++) {\n      if(typeof(data.series[i]) === 'object' && data.series[i].data !== undefined) {\n        data.series[i].data.reverse();\n      } else if(data.series[i] instanceof Array) {\n        data.series[i].reverse();\n      }\n    }\n  };\n\n  /**\n   * Convert data series into plain array\n   *\n   * @memberof Chartist.Core\n   * @param {Object} data The series object that contains the data to be visualized in the chart\n   * @param {Boolean} [reverse] If true the whole data is reversed by the getDataArray call. This will modify the data object passed as first parameter. The labels as well as the series order is reversed. The whole series data arrays are reversed too.\n   * @param {Boolean} [multi] Create a multi dimensional array from a series data array where a value object with `x` and `y` values will be created.\n   * @return {Array} A plain array that contains the data to be visualized in the chart\n   */\n  Chartist.getDataArray = function(data, reverse, multi) {\n    // Recursively walks through nested arrays and convert string values to numbers and objects with value properties\n    // to values. Check the tests in data core -> data normalization for a detailed specification of expected values\n    function recursiveConvert(value) {\n      if(Chartist.safeHasProperty(value, 'value')) {\n        // We are dealing with value object notation so we need to recurse on value property\n        return recursiveConvert(value.value);\n      } else if(Chartist.safeHasProperty(value, 'data')) {\n        // We are dealing with series object notation so we need to recurse on data property\n        return recursiveConvert(value.data);\n      } else if(value instanceof Array) {\n        // Data is of type array so we need to recurse on the series\n        return value.map(recursiveConvert);\n      } else if(Chartist.isDataHoleValue(value)) {\n        // We're dealing with a hole in the data and therefore need to return undefined\n        // We're also returning undefined for multi value output\n        return undefined;\n      } else {\n        // We need to prepare multi value output (x and y data)\n        if(multi) {\n          var multiValue = {};\n\n          // Single series value arrays are assumed to specify the Y-Axis value\n          // For example: [1, 2] => [{x: undefined, y: 1}, {x: undefined, y: 2}]\n          // If multi is a string then it's assumed that it specified which dimension should be filled as default\n          if(typeof multi === 'string') {\n            multiValue[multi] = Chartist.getNumberOrUndefined(value);\n          } else {\n            multiValue.y = Chartist.getNumberOrUndefined(value);\n          }\n\n          multiValue.x = value.hasOwnProperty('x') ? Chartist.getNumberOrUndefined(value.x) : multiValue.x;\n          multiValue.y = value.hasOwnProperty('y') ? Chartist.getNumberOrUndefined(value.y) : multiValue.y;\n\n          return multiValue;\n\n        } else {\n          // We can return simple data\n          return Chartist.getNumberOrUndefined(value);\n        }\n      }\n    }\n\n    return data.series.map(recursiveConvert);\n  };\n\n  /**\n   * Converts a number into a padding object.\n   *\n   * @memberof Chartist.Core\n   * @param {Object|Number} padding\n   * @param {Number} [fallback] This value is used to fill missing values if a incomplete padding object was passed\n   * @returns {Object} Returns a padding object containing top, right, bottom, left properties filled with the padding number passed in as argument. If the argument is something else than a number (presumably already a correct padding object) then this argument is directly returned.\n   */\n  Chartist.normalizePadding = function(padding, fallback) {\n    fallback = fallback || 0;\n\n    return typeof padding === 'number' ? {\n      top: padding,\n      right: padding,\n      bottom: padding,\n      left: padding\n    } : {\n      top: typeof padding.top === 'number' ? padding.top : fallback,\n      right: typeof padding.right === 'number' ? padding.right : fallback,\n      bottom: typeof padding.bottom === 'number' ? padding.bottom : fallback,\n      left: typeof padding.left === 'number' ? padding.left : fallback\n    };\n  };\n\n  Chartist.getMetaData = function(series, index) {\n    var value = series.data ? series.data[index] : series[index];\n    return value ? value.meta : undefined;\n  };\n\n  /**\n   * Calculate the order of magnitude for the chart scale\n   *\n   * @memberof Chartist.Core\n   * @param {Number} value The value Range of the chart\n   * @return {Number} The order of magnitude\n   */\n  Chartist.orderOfMagnitude = function (value) {\n    return Math.floor(Math.log(Math.abs(value)) / Math.LN10);\n  };\n\n  /**\n   * Project a data length into screen coordinates (pixels)\n   *\n   * @memberof Chartist.Core\n   * @param {Object} axisLength The svg element for the chart\n   * @param {Number} length Single data value from a series array\n   * @param {Object} bounds All the values to set the bounds of the chart\n   * @return {Number} The projected data length in pixels\n   */\n  Chartist.projectLength = function (axisLength, length, bounds) {\n    return length / bounds.range * axisLength;\n  };\n\n  /**\n   * Get the height of the area in the chart for the data series\n   *\n   * @memberof Chartist.Core\n   * @param {Object} svg The svg element for the chart\n   * @param {Object} options The Object that contains all the optional values for the chart\n   * @return {Number} The height of the area in the chart for the data series\n   */\n  Chartist.getAvailableHeight = function (svg, options) {\n    return Math.max((Chartist.quantity(options.height).value || svg.height()) - (options.chartPadding.top +  options.chartPadding.bottom) - options.axisX.offset, 0);\n  };\n\n  /**\n   * Get highest and lowest value of data array. This Array contains the data that will be visualized in the chart.\n   *\n   * @memberof Chartist.Core\n   * @param {Array} data The array that contains the data to be visualized in the chart\n   * @param {Object} options The Object that contains the chart options\n   * @param {String} dimension Axis dimension 'x' or 'y' used to access the correct value and high / low configuration\n   * @return {Object} An object that contains the highest and lowest value that will be visualized on the chart.\n   */\n  Chartist.getHighLow = function (data, options, dimension) {\n    // TODO: Remove workaround for deprecated global high / low config. Axis high / low configuration is preferred\n    options = Chartist.extend({}, options, dimension ? options['axis' + dimension.toUpperCase()] : {});\n\n    var highLow = {\n        high: options.high === undefined ? -Number.MAX_VALUE : +options.high,\n        low: options.low === undefined ? Number.MAX_VALUE : +options.low\n      };\n    var findHigh = options.high === undefined;\n    var findLow = options.low === undefined;\n\n    // Function to recursively walk through arrays and find highest and lowest number\n    function recursiveHighLow(data) {\n      if(data === undefined) {\n        return undefined;\n      } else if(data instanceof Array) {\n        for (var i = 0; i < data.length; i++) {\n          recursiveHighLow(data[i]);\n        }\n      } else {\n        var value = dimension ? +data[dimension] : +data;\n\n        if (findHigh && value > highLow.high) {\n          highLow.high = value;\n        }\n\n        if (findLow && value < highLow.low) {\n          highLow.low = value;\n        }\n      }\n    }\n\n    // Start to find highest and lowest number recursively\n    if(findHigh || findLow) {\n      recursiveHighLow(data);\n    }\n\n    // Overrides of high / low based on reference value, it will make sure that the invisible reference value is\n    // used to generate the chart. This is useful when the chart always needs to contain the position of the\n    // invisible reference value in the view i.e. for bipolar scales.\n    if (options.referenceValue || options.referenceValue === 0) {\n      highLow.high = Math.max(options.referenceValue, highLow.high);\n      highLow.low = Math.min(options.referenceValue, highLow.low);\n    }\n\n    // If high and low are the same because of misconfiguration or flat data (only the same value) we need\n    // to set the high or low to 0 depending on the polarity\n    if (highLow.high <= highLow.low) {\n      // If both values are 0 we set high to 1\n      if (highLow.low === 0) {\n        highLow.high = 1;\n      } else if (highLow.low < 0) {\n        // If we have the same negative value for the bounds we set bounds.high to 0\n        highLow.high = 0;\n      } else if (highLow.high > 0) {\n        // If we have the same positive value for the bounds we set bounds.low to 0\n        highLow.low = 0;\n      } else {\n        // If data array was empty, values are Number.MAX_VALUE and -Number.MAX_VALUE. Set bounds to prevent errors\n        highLow.high = 1;\n        highLow.low = 0;\n      }\n    }\n\n    return highLow;\n  };\n\n  /**\n   * Checks if a value can be safely coerced to a number. This includes all values except null which result in finite numbers when coerced. This excludes NaN, since it's not finite.\n   *\n   * @memberof Chartist.Core\n   * @param value\n   * @returns {Boolean}\n   */\n  Chartist.isNumeric = function(value) {\n    return value === null ? false : isFinite(value);\n  };\n\n  /**\n   * Returns true on all falsey values except the numeric value 0.\n   *\n   * @memberof Chartist.Core\n   * @param value\n   * @returns {boolean}\n   */\n  Chartist.isFalseyButZero = function(value) {\n    return !value && value !== 0;\n  };\n\n  /**\n   * Returns a number if the passed parameter is a valid number or the function will return undefined. On all other values than a valid number, this function will return undefined.\n   *\n   * @memberof Chartist.Core\n   * @param value\n   * @returns {*}\n   */\n  Chartist.getNumberOrUndefined = function(value) {\n    return Chartist.isNumeric(value) ? +value : undefined;\n  };\n\n  /**\n   * Checks if provided value object is multi value (contains x or y properties)\n   *\n   * @memberof Chartist.Core\n   * @param value\n   */\n  Chartist.isMultiValue = function(value) {\n    return typeof value === 'object' && ('x' in value || 'y' in value);\n  };\n\n  /**\n   * Gets a value from a dimension `value.x` or `value.y` while returning value directly if it's a valid numeric value. If the value is not numeric and it's falsey this function will return `defaultValue`.\n   *\n   * @memberof Chartist.Core\n   * @param value\n   * @param dimension\n   * @param defaultValue\n   * @returns {*}\n   */\n  Chartist.getMultiValue = function(value, dimension) {\n    if(Chartist.isMultiValue(value)) {\n      return Chartist.getNumberOrUndefined(value[dimension || 'y']);\n    } else {\n      return Chartist.getNumberOrUndefined(value);\n    }\n  };\n\n  /**\n   * Pollard Rho Algorithm to find smallest factor of an integer value. There are more efficient algorithms for factorization, but this one is quite efficient and not so complex.\n   *\n   * @memberof Chartist.Core\n   * @param {Number} num An integer number where the smallest factor should be searched for\n   * @returns {Number} The smallest integer factor of the parameter num.\n   */\n  Chartist.rho = function(num) {\n    if(num === 1) {\n      return num;\n    }\n\n    function gcd(p, q) {\n      if (p % q === 0) {\n        return q;\n      } else {\n        return gcd(q, p % q);\n      }\n    }\n\n    function f(x) {\n      return x * x + 1;\n    }\n\n    var x1 = 2, x2 = 2, divisor;\n    if (num % 2 === 0) {\n      return 2;\n    }\n\n    do {\n      x1 = f(x1) % num;\n      x2 = f(f(x2)) % num;\n      divisor = gcd(Math.abs(x1 - x2), num);\n    } while (divisor === 1);\n\n    return divisor;\n  };\n\n  /**\n   * Calculate and retrieve all the bounds for the chart and return them in one array\n   *\n   * @memberof Chartist.Core\n   * @param {Number} axisLength The length of the Axis used for\n   * @param {Object} highLow An object containing a high and low property indicating the value range of the chart.\n   * @param {Number} scaleMinSpace The minimum projected length a step should result in\n   * @param {Boolean} onlyInteger\n   * @return {Object} All the values to set the bounds of the chart\n   */\n  Chartist.getBounds = function (axisLength, highLow, scaleMinSpace, onlyInteger) {\n    var i,\n      optimizationCounter = 0,\n      newMin,\n      newMax,\n      bounds = {\n        high: highLow.high,\n        low: highLow.low\n      };\n\n    bounds.valueRange = bounds.high - bounds.low;\n    bounds.oom = Chartist.orderOfMagnitude(bounds.valueRange);\n    bounds.step = Math.pow(10, bounds.oom);\n    bounds.min = Math.floor(bounds.low / bounds.step) * bounds.step;\n    bounds.max = Math.ceil(bounds.high / bounds.step) * bounds.step;\n    bounds.range = bounds.max - bounds.min;\n    bounds.numberOfSteps = Math.round(bounds.range / bounds.step);\n\n    // Optimize scale step by checking if subdivision is possible based on horizontalGridMinSpace\n    // If we are already below the scaleMinSpace value we will scale up\n    var length = Chartist.projectLength(axisLength, bounds.step, bounds);\n    var scaleUp = length < scaleMinSpace;\n    var smallestFactor = onlyInteger ? Chartist.rho(bounds.range) : 0;\n\n    // First check if we should only use integer steps and if step 1 is still larger than scaleMinSpace so we can use 1\n    if(onlyInteger && Chartist.projectLength(axisLength, 1, bounds) >= scaleMinSpace) {\n      bounds.step = 1;\n    } else if(onlyInteger && smallestFactor < bounds.step && Chartist.projectLength(axisLength, smallestFactor, bounds) >= scaleMinSpace) {\n      // If step 1 was too small, we can try the smallest factor of range\n      // If the smallest factor is smaller than the current bounds.step and the projected length of smallest factor\n      // is larger than the scaleMinSpace we should go for it.\n      bounds.step = smallestFactor;\n    } else {\n      // Trying to divide or multiply by 2 and find the best step value\n      while (true) {\n        if (scaleUp && Chartist.projectLength(axisLength, bounds.step, bounds) <= scaleMinSpace) {\n          bounds.step *= 2;\n        } else if (!scaleUp && Chartist.projectLength(axisLength, bounds.step / 2, bounds) >= scaleMinSpace) {\n          bounds.step /= 2;\n          if(onlyInteger && bounds.step % 1 !== 0) {\n            bounds.step *= 2;\n            break;\n          }\n        } else {\n          break;\n        }\n\n        if(optimizationCounter++ > 1000) {\n          throw new Error('Exceeded maximum number of iterations while optimizing scale step!');\n        }\n      }\n    }\n\n    var EPSILON = 2.221E-16;\n    bounds.step = Math.max(bounds.step, EPSILON);\n    function safeIncrement(value, increment) {\n      // If increment is too small use *= (1+EPSILON) as a simple nextafter\n      if (value === (value += increment)) {\n      \tvalue *= (1 + (increment > 0 ? EPSILON : -EPSILON));\n      }\n      return value;\n    }\n\n    // Narrow min and max based on new step\n    newMin = bounds.min;\n    newMax = bounds.max;\n    while (newMin + bounds.step <= bounds.low) {\n    \tnewMin = safeIncrement(newMin, bounds.step);\n    }\n    while (newMax - bounds.step >= bounds.high) {\n    \tnewMax = safeIncrement(newMax, -bounds.step);\n    }\n    bounds.min = newMin;\n    bounds.max = newMax;\n    bounds.range = bounds.max - bounds.min;\n\n    var values = [];\n    for (i = bounds.min; i <= bounds.max; i = safeIncrement(i, bounds.step)) {\n      var value = Chartist.roundWithPrecision(i);\n      if (value !== values[values.length - 1]) {\n        values.push(value);\n      }\n    }\n    bounds.values = values;\n    return bounds;\n  };\n\n  /**\n   * Calculate cartesian coordinates of polar coordinates\n   *\n   * @memberof Chartist.Core\n   * @param {Number} centerX X-axis coordinates of center point of circle segment\n   * @param {Number} centerY X-axis coordinates of center point of circle segment\n   * @param {Number} radius Radius of circle segment\n   * @param {Number} angleInDegrees Angle of circle segment in degrees\n   * @return {{x:Number, y:Number}} Coordinates of point on circumference\n   */\n  Chartist.polarToCartesian = function (centerX, centerY, radius, angleInDegrees) {\n    var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\n\n    return {\n      x: centerX + (radius * Math.cos(angleInRadians)),\n      y: centerY + (radius * Math.sin(angleInRadians))\n    };\n  };\n\n  /**\n   * Initialize chart drawing rectangle (area where chart is drawn) x1,y1 = bottom left / x2,y2 = top right\n   *\n   * @memberof Chartist.Core\n   * @param {Object} svg The svg element for the chart\n   * @param {Object} options The Object that contains all the optional values for the chart\n   * @param {Number} [fallbackPadding] The fallback padding if partial padding objects are used\n   * @return {Object} The chart rectangles coordinates inside the svg element plus the rectangles measurements\n   */\n  Chartist.createChartRect = function (svg, options, fallbackPadding) {\n    var hasAxis = !!(options.axisX || options.axisY);\n    var yAxisOffset = hasAxis ? options.axisY.offset : 0;\n    var xAxisOffset = hasAxis ? options.axisX.offset : 0;\n    // If width or height results in invalid value (including 0) we fallback to the unitless settings or even 0\n    var width = svg.width() || Chartist.quantity(options.width).value || 0;\n    var height = svg.height() || Chartist.quantity(options.height).value || 0;\n    var normalizedPadding = Chartist.normalizePadding(options.chartPadding, fallbackPadding);\n\n    // If settings were to small to cope with offset (legacy) and padding, we'll adjust\n    width = Math.max(width, yAxisOffset + normalizedPadding.left + normalizedPadding.right);\n    height = Math.max(height, xAxisOffset + normalizedPadding.top + normalizedPadding.bottom);\n\n    var chartRect = {\n      padding: normalizedPadding,\n      width: function () {\n        return this.x2 - this.x1;\n      },\n      height: function () {\n        return this.y1 - this.y2;\n      }\n    };\n\n    if(hasAxis) {\n      if (options.axisX.position === 'start') {\n        chartRect.y2 = normalizedPadding.top + xAxisOffset;\n        chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n      } else {\n        chartRect.y2 = normalizedPadding.top;\n        chartRect.y1 = Math.max(height - normalizedPadding.bottom - xAxisOffset, chartRect.y2 + 1);\n      }\n\n      if (options.axisY.position === 'start') {\n        chartRect.x1 = normalizedPadding.left + yAxisOffset;\n        chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n      } else {\n        chartRect.x1 = normalizedPadding.left;\n        chartRect.x2 = Math.max(width - normalizedPadding.right - yAxisOffset, chartRect.x1 + 1);\n      }\n    } else {\n      chartRect.x1 = normalizedPadding.left;\n      chartRect.x2 = Math.max(width - normalizedPadding.right, chartRect.x1 + 1);\n      chartRect.y2 = normalizedPadding.top;\n      chartRect.y1 = Math.max(height - normalizedPadding.bottom, chartRect.y2 + 1);\n    }\n\n    return chartRect;\n  };\n\n  /**\n   * Creates a grid line based on a projected value.\n   *\n   * @memberof Chartist.Core\n   * @param position\n   * @param index\n   * @param axis\n   * @param offset\n   * @param length\n   * @param group\n   * @param classes\n   * @param eventEmitter\n   */\n  Chartist.createGrid = function(position, index, axis, offset, length, group, classes, eventEmitter) {\n    var positionalData = {};\n    positionalData[axis.units.pos + '1'] = position;\n    positionalData[axis.units.pos + '2'] = position;\n    positionalData[axis.counterUnits.pos + '1'] = offset;\n    positionalData[axis.counterUnits.pos + '2'] = offset + length;\n\n    var gridElement = group.elem('line', positionalData, classes.join(' '));\n\n    // Event for grid draw\n    eventEmitter.emit('draw',\n      Chartist.extend({\n        type: 'grid',\n        axis: axis,\n        index: index,\n        group: group,\n        element: gridElement\n      }, positionalData)\n    );\n  };\n\n  /**\n   * Creates a grid background rect and emits the draw event.\n   *\n   * @memberof Chartist.Core\n   * @param gridGroup\n   * @param chartRect\n   * @param className\n   * @param eventEmitter\n   */\n  Chartist.createGridBackground = function (gridGroup, chartRect, className, eventEmitter) {\n    var gridBackground = gridGroup.elem('rect', {\n        x: chartRect.x1,\n        y: chartRect.y2,\n        width: chartRect.width(),\n        height: chartRect.height(),\n      }, className, true);\n\n      // Event for grid background draw\n      eventEmitter.emit('draw', {\n        type: 'gridBackground',\n        group: gridGroup,\n        element: gridBackground\n      });\n  };\n\n  /**\n   * Creates a label based on a projected value and an axis.\n   *\n   * @memberof Chartist.Core\n   * @param position\n   * @param length\n   * @param index\n   * @param labels\n   * @param axis\n   * @param axisOffset\n   * @param labelOffset\n   * @param group\n   * @param classes\n   * @param useForeignObject\n   * @param eventEmitter\n   */\n  Chartist.createLabel = function(position, length, index, labels, axis, axisOffset, labelOffset, group, classes, useForeignObject, eventEmitter) {\n    var labelElement;\n    var positionalData = {};\n\n    positionalData[axis.units.pos] = position + labelOffset[axis.units.pos];\n    positionalData[axis.counterUnits.pos] = labelOffset[axis.counterUnits.pos];\n    positionalData[axis.units.len] = length;\n    positionalData[axis.counterUnits.len] = Math.max(0, axisOffset - 10);\n\n    if(useForeignObject) {\n      // We need to set width and height explicitly to px as span will not expand with width and height being\n      // 100% in all browsers\n      var content = document.createElement('span');\n      content.className = classes.join(' ');\n      content.setAttribute('xmlns', Chartist.namespaces.xhtml);\n      content.innerText = labels[index];\n      content.style[axis.units.len] = Math.round(positionalData[axis.units.len]) + 'px';\n      content.style[axis.counterUnits.len] = Math.round(positionalData[axis.counterUnits.len]) + 'px';\n\n      labelElement = group.foreignObject(content, Chartist.extend({\n        style: 'overflow: visible;'\n      }, positionalData));\n    } else {\n      labelElement = group.elem('text', positionalData, classes.join(' ')).text(labels[index]);\n    }\n\n    eventEmitter.emit('draw', Chartist.extend({\n      type: 'label',\n      axis: axis,\n      index: index,\n      group: group,\n      element: labelElement,\n      text: labels[index]\n    }, positionalData));\n  };\n\n  /**\n   * Helper to read series specific options from options object. It automatically falls back to the global option if\n   * there is no option in the series options.\n   *\n   * @param {Object} series Series object\n   * @param {Object} options Chartist options object\n   * @param {string} key The options key that should be used to obtain the options\n   * @returns {*}\n   */\n  Chartist.getSeriesOption = function(series, options, key) {\n    if(series.name && options.series && options.series[series.name]) {\n      var seriesOptions = options.series[series.name];\n      return seriesOptions.hasOwnProperty(key) ? seriesOptions[key] : options[key];\n    } else {\n      return options[key];\n    }\n  };\n\n  /**\n   * Provides options handling functionality with callback for options changes triggered by responsive options and media query matches\n   *\n   * @memberof Chartist.Core\n   * @param {Object} options Options set by user\n   * @param {Array} responsiveOptions Optional functions to add responsive behavior to chart\n   * @param {Object} eventEmitter The event emitter that will be used to emit the options changed events\n   * @return {Object} The consolidated options object from the defaults, base and matching responsive options\n   */\n  Chartist.optionsProvider = function (options, responsiveOptions, eventEmitter) {\n    var baseOptions = Chartist.extend({}, options),\n      currentOptions,\n      mediaQueryListeners = [],\n      i;\n\n    function updateCurrentOptions(mediaEvent) {\n      var previousOptions = currentOptions;\n      currentOptions = Chartist.extend({}, baseOptions);\n\n      if (responsiveOptions) {\n        for (i = 0; i < responsiveOptions.length; i++) {\n          var mql = window.matchMedia(responsiveOptions[i][0]);\n          if (mql.matches) {\n            currentOptions = Chartist.extend(currentOptions, responsiveOptions[i][1]);\n          }\n        }\n      }\n\n      if(eventEmitter && mediaEvent) {\n        eventEmitter.emit('optionsChanged', {\n          previousOptions: previousOptions,\n          currentOptions: currentOptions\n        });\n      }\n    }\n\n    function removeMediaQueryListeners() {\n      mediaQueryListeners.forEach(function(mql) {\n        mql.removeListener(updateCurrentOptions);\n      });\n    }\n\n    if (!window.matchMedia) {\n      throw 'window.matchMedia not found! Make sure you\\'re using a polyfill.';\n    } else if (responsiveOptions) {\n\n      for (i = 0; i < responsiveOptions.length; i++) {\n        var mql = window.matchMedia(responsiveOptions[i][0]);\n        mql.addListener(updateCurrentOptions);\n        mediaQueryListeners.push(mql);\n      }\n    }\n    // Execute initially without an event argument so we get the correct options\n    updateCurrentOptions();\n\n    return {\n      removeMediaQueryListeners: removeMediaQueryListeners,\n      getCurrentOptions: function getCurrentOptions() {\n        return Chartist.extend({}, currentOptions);\n      }\n    };\n  };\n\n\n  /**\n   * Splits a list of coordinates and associated values into segments. Each returned segment contains a pathCoordinates\n   * valueData property describing the segment.\n   *\n   * With the default options, segments consist of contiguous sets of points that do not have an undefined value. Any\n   * points with undefined values are discarded.\n   *\n   * **Options**\n   * The following options are used to determine how segments are formed\n   * ```javascript\n   * var options = {\n   *   // If fillHoles is true, undefined values are simply discarded without creating a new segment. Assuming other options are default, this returns single segment.\n   *   fillHoles: false,\n   *   // If increasingX is true, the coordinates in all segments have strictly increasing x-values.\n   *   increasingX: false\n   * };\n   * ```\n   *\n   * @memberof Chartist.Core\n   * @param {Array} pathCoordinates List of point coordinates to be split in the form [x1, y1, x2, y2 ... xn, yn]\n   * @param {Array} values List of associated point values in the form [v1, v2 .. vn]\n   * @param {Object} options Options set by user\n   * @return {Array} List of segments, each containing a pathCoordinates and valueData property.\n   */\n  Chartist.splitIntoSegments = function(pathCoordinates, valueData, options) {\n    var defaultOptions = {\n      increasingX: false,\n      fillHoles: false\n    };\n\n    options = Chartist.extend({}, defaultOptions, options);\n\n    var segments = [];\n    var hole = true;\n\n    for(var i = 0; i < pathCoordinates.length; i += 2) {\n      // If this value is a \"hole\" we set the hole flag\n      if(Chartist.getMultiValue(valueData[i / 2].value) === undefined) {\n      // if(valueData[i / 2].value === undefined) {\n        if(!options.fillHoles) {\n          hole = true;\n        }\n      } else {\n        if(options.increasingX && i >= 2 && pathCoordinates[i] <= pathCoordinates[i-2]) {\n          // X is not increasing, so we need to make sure we start a new segment\n          hole = true;\n        }\n\n\n        // If it's a valid value we need to check if we're coming out of a hole and create a new empty segment\n        if(hole) {\n          segments.push({\n            pathCoordinates: [],\n            valueData: []\n          });\n          // As we have a valid value now, we are not in a \"hole\" anymore\n          hole = false;\n        }\n\n        // Add to the segment pathCoordinates and valueData\n        segments[segments.length - 1].pathCoordinates.push(pathCoordinates[i], pathCoordinates[i + 1]);\n        segments[segments.length - 1].valueData.push(valueData[i / 2]);\n      }\n    }\n\n    return segments;\n  };\n}(this || global, Chartist));\n;/**\n * Chartist path interpolation functions.\n *\n * @module Chartist.Interpolation\n */\n/* global Chartist */\n(function(globalRoot, Chartist) {\n  'use strict';\n\n  Chartist.Interpolation = {};\n\n  /**\n   * This interpolation function does not smooth the path and the result is only containing lines and no curves.\n   *\n   * @example\n   * var chart = new Chartist.Line('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5],\n   *   series: [[1, 2, 8, 1, 7]]\n   * }, {\n   *   lineSmooth: Chartist.Interpolation.none({\n   *     fillHoles: false\n   *   })\n   * });\n   *\n   *\n   * @memberof Chartist.Interpolation\n   * @return {Function}\n   */\n  Chartist.Interpolation.none = function(options) {\n    var defaultOptions = {\n      fillHoles: false\n    };\n    options = Chartist.extend({}, defaultOptions, options);\n    return function none(pathCoordinates, valueData) {\n      var path = new Chartist.Svg.Path();\n      var hole = true;\n\n      for(var i = 0; i < pathCoordinates.length; i += 2) {\n        var currX = pathCoordinates[i];\n        var currY = pathCoordinates[i + 1];\n        var currData = valueData[i / 2];\n\n        if(Chartist.getMultiValue(currData.value) !== undefined) {\n\n          if(hole) {\n            path.move(currX, currY, false, currData);\n          } else {\n            path.line(currX, currY, false, currData);\n          }\n\n          hole = false;\n        } else if(!options.fillHoles) {\n          hole = true;\n        }\n      }\n\n      return path;\n    };\n  };\n\n  /**\n   * Simple smoothing creates horizontal handles that are positioned with a fraction of the length between two data points. You can use the divisor option to specify the amount of smoothing.\n   *\n   * Simple smoothing can be used instead of `Chartist.Smoothing.cardinal` if you'd like to get rid of the artifacts it produces sometimes. Simple smoothing produces less flowing lines but is accurate by hitting the points and it also doesn't swing below or above the given data point.\n   *\n   * All smoothing functions within Chartist are factory functions that accept an options parameter. The simple interpolation function accepts one configuration parameter `divisor`, between 1 and ∞, which controls the smoothing characteristics.\n   *\n   * @example\n   * var chart = new Chartist.Line('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5],\n   *   series: [[1, 2, 8, 1, 7]]\n   * }, {\n   *   lineSmooth: Chartist.Interpolation.simple({\n   *     divisor: 2,\n   *     fillHoles: false\n   *   })\n   * });\n   *\n   *\n   * @memberof Chartist.Interpolation\n   * @param {Object} options The options of the simple interpolation factory function.\n   * @return {Function}\n   */\n  Chartist.Interpolation.simple = function(options) {\n    var defaultOptions = {\n      divisor: 2,\n      fillHoles: false\n    };\n    options = Chartist.extend({}, defaultOptions, options);\n\n    var d = 1 / Math.max(1, options.divisor);\n\n    return function simple(pathCoordinates, valueData) {\n      var path = new Chartist.Svg.Path();\n      var prevX, prevY, prevData;\n\n      for(var i = 0; i < pathCoordinates.length; i += 2) {\n        var currX = pathCoordinates[i];\n        var currY = pathCoordinates[i + 1];\n        var length = (currX - prevX) * d;\n        var currData = valueData[i / 2];\n\n        if(currData.value !== undefined) {\n\n          if(prevData === undefined) {\n            path.move(currX, currY, false, currData);\n          } else {\n            path.curve(\n              prevX + length,\n              prevY,\n              currX - length,\n              currY,\n              currX,\n              currY,\n              false,\n              currData\n            );\n          }\n\n          prevX = currX;\n          prevY = currY;\n          prevData = currData;\n        } else if(!options.fillHoles) {\n          prevX = currX = prevData = undefined;\n        }\n      }\n\n      return path;\n    };\n  };\n\n  /**\n   * Cardinal / Catmull-Rome spline interpolation is the default smoothing function in Chartist. It produces nice results where the splines will always meet the points. It produces some artifacts though when data values are increased or decreased rapidly. The line may not follow a very accurate path and if the line should be accurate this smoothing function does not produce the best results.\n   *\n   * Cardinal splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n   *\n   * All smoothing functions within Chartist are factory functions that accept an options parameter. The cardinal interpolation function accepts one configuration parameter `tension`, between 0 and 1, which controls the smoothing intensity.\n   *\n   * @example\n   * var chart = new Chartist.Line('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5],\n   *   series: [[1, 2, 8, 1, 7]]\n   * }, {\n   *   lineSmooth: Chartist.Interpolation.cardinal({\n   *     tension: 1,\n   *     fillHoles: false\n   *   })\n   * });\n   *\n   * @memberof Chartist.Interpolation\n   * @param {Object} options The options of the cardinal factory function.\n   * @return {Function}\n   */\n  Chartist.Interpolation.cardinal = function(options) {\n    var defaultOptions = {\n      tension: 1,\n      fillHoles: false\n    };\n\n    options = Chartist.extend({}, defaultOptions, options);\n\n    var t = Math.min(1, Math.max(0, options.tension)),\n      c = 1 - t;\n\n    return function cardinal(pathCoordinates, valueData) {\n      // First we try to split the coordinates into segments\n      // This is necessary to treat \"holes\" in line charts\n      var segments = Chartist.splitIntoSegments(pathCoordinates, valueData, {\n        fillHoles: options.fillHoles\n      });\n\n      if(!segments.length) {\n        // If there were no segments return 'Chartist.Interpolation.none'\n        return Chartist.Interpolation.none()([]);\n      } else if(segments.length > 1) {\n        // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n        // afterwards together into a single path.\n          var paths = [];\n        // For each segment we will recurse the cardinal function\n        segments.forEach(function(segment) {\n          paths.push(cardinal(segment.pathCoordinates, segment.valueData));\n        });\n        // Join the segment path data into a single path and return\n        return Chartist.Svg.Path.join(paths);\n      } else {\n        // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n        // segment\n        pathCoordinates = segments[0].pathCoordinates;\n        valueData = segments[0].valueData;\n\n        // If less than two points we need to fallback to no smoothing\n        if(pathCoordinates.length <= 4) {\n          return Chartist.Interpolation.none()(pathCoordinates, valueData);\n        }\n\n        var path = new Chartist.Svg.Path().move(pathCoordinates[0], pathCoordinates[1], false, valueData[0]),\n          z;\n\n        for (var i = 0, iLen = pathCoordinates.length; iLen - 2 * !z > i; i += 2) {\n          var p = [\n            {x: +pathCoordinates[i - 2], y: +pathCoordinates[i - 1]},\n            {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]},\n            {x: +pathCoordinates[i + 2], y: +pathCoordinates[i + 3]},\n            {x: +pathCoordinates[i + 4], y: +pathCoordinates[i + 5]}\n          ];\n          if (z) {\n            if (!i) {\n              p[0] = {x: +pathCoordinates[iLen - 2], y: +pathCoordinates[iLen - 1]};\n            } else if (iLen - 4 === i) {\n              p[3] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n            } else if (iLen - 2 === i) {\n              p[2] = {x: +pathCoordinates[0], y: +pathCoordinates[1]};\n              p[3] = {x: +pathCoordinates[2], y: +pathCoordinates[3]};\n            }\n          } else {\n            if (iLen - 4 === i) {\n              p[3] = p[2];\n            } else if (!i) {\n              p[0] = {x: +pathCoordinates[i], y: +pathCoordinates[i + 1]};\n            }\n          }\n\n          path.curve(\n            (t * (-p[0].x + 6 * p[1].x + p[2].x) / 6) + (c * p[2].x),\n            (t * (-p[0].y + 6 * p[1].y + p[2].y) / 6) + (c * p[2].y),\n            (t * (p[1].x + 6 * p[2].x - p[3].x) / 6) + (c * p[2].x),\n            (t * (p[1].y + 6 * p[2].y - p[3].y) / 6) + (c * p[2].y),\n            p[2].x,\n            p[2].y,\n            false,\n            valueData[(i + 2) / 2]\n          );\n        }\n\n        return path;\n      }\n    };\n  };\n\n  /**\n   * Monotone Cubic spline interpolation produces a smooth curve which preserves monotonicity. Unlike cardinal splines, the curve will not extend beyond the range of y-values of the original data points.\n   *\n   * Monotone Cubic splines can only be created if there are more than two data points. If this is not the case this smoothing will fallback to `Chartist.Smoothing.none`.\n   *\n   * The x-values of subsequent points must be increasing to fit a Monotone Cubic spline. If this condition is not met for a pair of adjacent points, then there will be a break in the curve between those data points.\n   *\n   * All smoothing functions within Chartist are factory functions that accept an options parameter.\n   *\n   * @example\n   * var chart = new Chartist.Line('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5],\n   *   series: [[1, 2, 8, 1, 7]]\n   * }, {\n   *   lineSmooth: Chartist.Interpolation.monotoneCubic({\n   *     fillHoles: false\n   *   })\n   * });\n   *\n   * @memberof Chartist.Interpolation\n   * @param {Object} options The options of the monotoneCubic factory function.\n   * @return {Function}\n   */\n  Chartist.Interpolation.monotoneCubic = function(options) {\n    var defaultOptions = {\n      fillHoles: false\n    };\n\n    options = Chartist.extend({}, defaultOptions, options);\n\n    return function monotoneCubic(pathCoordinates, valueData) {\n      // First we try to split the coordinates into segments\n      // This is necessary to treat \"holes\" in line charts\n      var segments = Chartist.splitIntoSegments(pathCoordinates, valueData, {\n        fillHoles: options.fillHoles,\n        increasingX: true\n      });\n\n      if(!segments.length) {\n        // If there were no segments return 'Chartist.Interpolation.none'\n        return Chartist.Interpolation.none()([]);\n      } else if(segments.length > 1) {\n        // If the split resulted in more that one segment we need to interpolate each segment individually and join them\n        // afterwards together into a single path.\n          var paths = [];\n        // For each segment we will recurse the monotoneCubic fn function\n        segments.forEach(function(segment) {\n          paths.push(monotoneCubic(segment.pathCoordinates, segment.valueData));\n        });\n        // Join the segment path data into a single path and return\n        return Chartist.Svg.Path.join(paths);\n      } else {\n        // If there was only one segment we can proceed regularly by using pathCoordinates and valueData from the first\n        // segment\n        pathCoordinates = segments[0].pathCoordinates;\n        valueData = segments[0].valueData;\n\n        // If less than three points we need to fallback to no smoothing\n        if(pathCoordinates.length <= 4) {\n          return Chartist.Interpolation.none()(pathCoordinates, valueData);\n        }\n\n        var xs = [],\n          ys = [],\n          i,\n          n = pathCoordinates.length / 2,\n          ms = [],\n          ds = [], dys = [], dxs = [],\n          path;\n\n        // Populate x and y coordinates into separate arrays, for readability\n\n        for(i = 0; i < n; i++) {\n          xs[i] = pathCoordinates[i * 2];\n          ys[i] = pathCoordinates[i * 2 + 1];\n        }\n\n        // Calculate deltas and derivative\n\n        for(i = 0; i < n - 1; i++) {\n          dys[i] = ys[i + 1] - ys[i];\n          dxs[i] = xs[i + 1] - xs[i];\n          ds[i] = dys[i] / dxs[i];\n        }\n\n        // Determine desired slope (m) at each point using Fritsch-Carlson method\n        // See: http://math.stackexchange.com/questions/45218/implementation-of-monotone-cubic-interpolation\n\n        ms[0] = ds[0];\n        ms[n - 1] = ds[n - 2];\n\n        for(i = 1; i < n - 1; i++) {\n          if(ds[i] === 0 || ds[i - 1] === 0 || (ds[i - 1] > 0) !== (ds[i] > 0)) {\n            ms[i] = 0;\n          } else {\n            ms[i] = 3 * (dxs[i - 1] + dxs[i]) / (\n              (2 * dxs[i] + dxs[i - 1]) / ds[i - 1] +\n              (dxs[i] + 2 * dxs[i - 1]) / ds[i]);\n\n            if(!isFinite(ms[i])) {\n              ms[i] = 0;\n            }\n          }\n        }\n\n        // Now build a path from the slopes\n\n        path = new Chartist.Svg.Path().move(xs[0], ys[0], false, valueData[0]);\n\n        for(i = 0; i < n - 1; i++) {\n          path.curve(\n            // First control point\n            xs[i] + dxs[i] / 3,\n            ys[i] + ms[i] * dxs[i] / 3,\n            // Second control point\n            xs[i + 1] - dxs[i] / 3,\n            ys[i + 1] - ms[i + 1] * dxs[i] / 3,\n            // End point\n            xs[i + 1],\n            ys[i + 1],\n\n            false,\n            valueData[i + 1]\n          );\n        }\n\n        return path;\n      }\n    };\n  };\n\n  /**\n   * Step interpolation will cause the line chart to move in steps rather than diagonal or smoothed lines. This interpolation will create additional points that will also be drawn when the `showPoint` option is enabled.\n   *\n   * All smoothing functions within Chartist are factory functions that accept an options parameter. The step interpolation function accepts one configuration parameter `postpone`, that can be `true` or `false`. The default value is `true` and will cause the step to occur where the value actually changes. If a different behaviour is needed where the step is shifted to the left and happens before the actual value, this option can be set to `false`.\n   *\n   * @example\n   * var chart = new Chartist.Line('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5],\n   *   series: [[1, 2, 8, 1, 7]]\n   * }, {\n   *   lineSmooth: Chartist.Interpolation.step({\n   *     postpone: true,\n   *     fillHoles: false\n   *   })\n   * });\n   *\n   * @memberof Chartist.Interpolation\n   * @param options\n   * @returns {Function}\n   */\n  Chartist.Interpolation.step = function(options) {\n    var defaultOptions = {\n      postpone: true,\n      fillHoles: false\n    };\n\n    options = Chartist.extend({}, defaultOptions, options);\n\n    return function step(pathCoordinates, valueData) {\n      var path = new Chartist.Svg.Path();\n\n      var prevX, prevY, prevData;\n\n      for (var i = 0; i < pathCoordinates.length; i += 2) {\n        var currX = pathCoordinates[i];\n        var currY = pathCoordinates[i + 1];\n        var currData = valueData[i / 2];\n\n        // If the current point is also not a hole we can draw the step lines\n        if(currData.value !== undefined) {\n          if(prevData === undefined) {\n            path.move(currX, currY, false, currData);\n          } else {\n            if(options.postpone) {\n              // If postponed we should draw the step line with the value of the previous value\n              path.line(currX, prevY, false, prevData);\n            } else {\n              // If not postponed we should draw the step line with the value of the current value\n              path.line(prevX, currY, false, currData);\n            }\n            // Line to the actual point (this should only be a Y-Axis movement\n            path.line(currX, currY, false, currData);\n          }\n\n          prevX = currX;\n          prevY = currY;\n          prevData = currData;\n        } else if(!options.fillHoles) {\n          prevX = prevY = prevData = undefined;\n        }\n      }\n\n      return path;\n    };\n  };\n\n}(this || global, Chartist));\n;/**\n * A very basic event module that helps to generate and catch events.\n *\n * @module Chartist.Event\n */\n/* global Chartist */\n(function (globalRoot, Chartist) {\n  'use strict';\n\n  Chartist.EventEmitter = function () {\n    var handlers = [];\n\n    /**\n     * Add an event handler for a specific event\n     *\n     * @memberof Chartist.Event\n     * @param {String} event The event name\n     * @param {Function} handler A event handler function\n     */\n    function addEventHandler(event, handler) {\n      handlers[event] = handlers[event] || [];\n      handlers[event].push(handler);\n    }\n\n    /**\n     * Remove an event handler of a specific event name or remove all event handlers for a specific event.\n     *\n     * @memberof Chartist.Event\n     * @param {String} event The event name where a specific or all handlers should be removed\n     * @param {Function} [handler] An optional event handler function. If specified only this specific handler will be removed and otherwise all handlers are removed.\n     */\n    function removeEventHandler(event, handler) {\n      // Only do something if there are event handlers with this name existing\n      if(handlers[event]) {\n        // If handler is set we will look for a specific handler and only remove this\n        if(handler) {\n          handlers[event].splice(handlers[event].indexOf(handler), 1);\n          if(handlers[event].length === 0) {\n            delete handlers[event];\n          }\n        } else {\n          // If no handler is specified we remove all handlers for this event\n          delete handlers[event];\n        }\n      }\n    }\n\n    /**\n     * Use this function to emit an event. All handlers that are listening for this event will be triggered with the data parameter.\n     *\n     * @memberof Chartist.Event\n     * @param {String} event The event name that should be triggered\n     * @param {*} data Arbitrary data that will be passed to the event handler callback functions\n     */\n    function emit(event, data) {\n      // Only do something if there are event handlers with this name existing\n      if(handlers[event]) {\n        handlers[event].forEach(function(handler) {\n          handler(data);\n        });\n      }\n\n      // Emit event to star event handlers\n      if(handlers['*']) {\n        handlers['*'].forEach(function(starHandler) {\n          starHandler(event, data);\n        });\n      }\n    }\n\n    return {\n      addEventHandler: addEventHandler,\n      removeEventHandler: removeEventHandler,\n      emit: emit\n    };\n  };\n\n}(this || global, Chartist));\n;/**\n * This module provides some basic prototype inheritance utilities.\n *\n * @module Chartist.Class\n */\n/* global Chartist */\n(function(globalRoot, Chartist) {\n  'use strict';\n\n  function listToArray(list) {\n    var arr = [];\n    if (list.length) {\n      for (var i = 0; i < list.length; i++) {\n        arr.push(list[i]);\n      }\n    }\n    return arr;\n  }\n\n  /**\n   * Method to extend from current prototype.\n   *\n   * @memberof Chartist.Class\n   * @param {Object} properties The object that serves as definition for the prototype that gets created for the new class. This object should always contain a constructor property that is the desired constructor for the newly created class.\n   * @param {Object} [superProtoOverride] By default extens will use the current class prototype or Chartist.class. With this parameter you can specify any super prototype that will be used.\n   * @return {Function} Constructor function of the new class\n   *\n   * @example\n   * var Fruit = Class.extend({\n     * color: undefined,\n     *   sugar: undefined,\n     *\n     *   constructor: function(color, sugar) {\n     *     this.color = color;\n     *     this.sugar = sugar;\n     *   },\n     *\n     *   eat: function() {\n     *     this.sugar = 0;\n     *     return this;\n     *   }\n     * });\n   *\n   * var Banana = Fruit.extend({\n     *   length: undefined,\n     *\n     *   constructor: function(length, sugar) {\n     *     Banana.super.constructor.call(this, 'Yellow', sugar);\n     *     this.length = length;\n     *   }\n     * });\n   *\n   * var banana = new Banana(20, 40);\n   * console.log('banana instanceof Fruit', banana instanceof Fruit);\n   * console.log('Fruit is prototype of banana', Fruit.prototype.isPrototypeOf(banana));\n   * console.log('bananas prototype is Fruit', Object.getPrototypeOf(banana) === Fruit.prototype);\n   * console.log(banana.sugar);\n   * console.log(banana.eat().sugar);\n   * console.log(banana.color);\n   */\n  function extend(properties, superProtoOverride) {\n    var superProto = superProtoOverride || this.prototype || Chartist.Class;\n    var proto = Object.create(superProto);\n\n    Chartist.Class.cloneDefinitions(proto, properties);\n\n    var constr = function() {\n      var fn = proto.constructor || function () {},\n        instance;\n\n      // If this is linked to the Chartist namespace the constructor was not called with new\n      // To provide a fallback we will instantiate here and return the instance\n      instance = this === Chartist ? Object.create(proto) : this;\n      fn.apply(instance, Array.prototype.slice.call(arguments, 0));\n\n      // If this constructor was not called with new we need to return the instance\n      // This will not harm when the constructor has been called with new as the returned value is ignored\n      return instance;\n    };\n\n    constr.prototype = proto;\n    constr.super = superProto;\n    constr.extend = this.extend;\n\n    return constr;\n  }\n\n  // Variable argument list clones args > 0 into args[0] and retruns modified args[0]\n  function cloneDefinitions() {\n    var args = listToArray(arguments);\n    var target = args[0];\n\n    args.splice(1, args.length - 1).forEach(function (source) {\n      Object.getOwnPropertyNames(source).forEach(function (propName) {\n        // If this property already exist in target we delete it first\n        delete target[propName];\n        // Define the property with the descriptor from source\n        Object.defineProperty(target, propName,\n          Object.getOwnPropertyDescriptor(source, propName));\n      });\n    });\n\n    return target;\n  }\n\n  Chartist.Class = {\n    extend: extend,\n    cloneDefinitions: cloneDefinitions\n  };\n\n}(this || global, Chartist));\n;/**\n * Base for all chart types. The methods in Chartist.Base are inherited to all chart types.\n *\n * @module Chartist.Base\n */\n/* global Chartist */\n(function(globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n\n  // TODO: Currently we need to re-draw the chart on window resize. This is usually very bad and will affect performance.\n  // This is done because we can't work with relative coordinates when drawing the chart because SVG Path does not\n  // work with relative positions yet. We need to check if we can do a viewBox hack to switch to percentage.\n  // See http://mozilla.6506.n7.nabble.com/Specyfing-paths-with-percentages-unit-td247474.html\n  // Update: can be done using the above method tested here: http://codepen.io/gionkunz/pen/KDvLj\n  // The problem is with the label offsets that can't be converted into percentage and affecting the chart container\n  /**\n   * Updates the chart which currently does a full reconstruction of the SVG DOM\n   *\n   * @param {Object} [data] Optional data you'd like to set for the chart before it will update. If not specified the update method will use the data that is already configured with the chart.\n   * @param {Object} [options] Optional options you'd like to add to the previous options for the chart before it will update. If not specified the update method will use the options that have been already configured with the chart.\n   * @param {Boolean} [override] If set to true, the passed options will be used to extend the options that have been configured already. Otherwise the chart default options will be used as the base\n   * @memberof Chartist.Base\n   */\n  function update(data, options, override) {\n    if(data) {\n      this.data = data || {};\n      this.data.labels = this.data.labels || [];\n      this.data.series = this.data.series || [];\n      // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n      this.eventEmitter.emit('data', {\n        type: 'update',\n        data: this.data\n      });\n    }\n\n    if(options) {\n      this.options = Chartist.extend({}, override ? this.options : this.defaultOptions, options);\n\n      // If chartist was not initialized yet, we just set the options and leave the rest to the initialization\n      // Otherwise we re-create the optionsProvider at this point\n      if(!this.initializeTimeoutId) {\n        this.optionsProvider.removeMediaQueryListeners();\n        this.optionsProvider = Chartist.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n      }\n    }\n\n    // Only re-created the chart if it has been initialized yet\n    if(!this.initializeTimeoutId) {\n      this.createChart(this.optionsProvider.getCurrentOptions());\n    }\n\n    // Return a reference to the chart object to chain up calls\n    return this;\n  }\n\n  /**\n   * This method can be called on the API object of each chart and will un-register all event listeners that were added to other components. This currently includes a window.resize listener as well as media query listeners if any responsive options have been provided. Use this function if you need to destroy and recreate Chartist charts dynamically.\n   *\n   * @memberof Chartist.Base\n   */\n  function detach() {\n    // Only detach if initialization already occurred on this chart. If this chart still hasn't initialized (therefore\n    // the initializationTimeoutId is still a valid timeout reference, we will clear the timeout\n    if(!this.initializeTimeoutId) {\n      window.removeEventListener('resize', this.resizeListener);\n      this.optionsProvider.removeMediaQueryListeners();\n    } else {\n      window.clearTimeout(this.initializeTimeoutId);\n    }\n\n    return this;\n  }\n\n  /**\n   * Use this function to register event handlers. The handler callbacks are synchronous and will run in the main thread rather than the event loop.\n   *\n   * @memberof Chartist.Base\n   * @param {String} event Name of the event. Check the examples for supported events.\n   * @param {Function} handler The handler function that will be called when an event with the given name was emitted. This function will receive a data argument which contains event data. See the example for more details.\n   */\n  function on(event, handler) {\n    this.eventEmitter.addEventHandler(event, handler);\n    return this;\n  }\n\n  /**\n   * Use this function to un-register event handlers. If the handler function parameter is omitted all handlers for the given event will be un-registered.\n   *\n   * @memberof Chartist.Base\n   * @param {String} event Name of the event for which a handler should be removed\n   * @param {Function} [handler] The handler function that that was previously used to register a new event handler. This handler will be removed from the event handler list. If this parameter is omitted then all event handlers for the given event are removed from the list.\n   */\n  function off(event, handler) {\n    this.eventEmitter.removeEventHandler(event, handler);\n    return this;\n  }\n\n  function initialize() {\n    // Add window resize listener that re-creates the chart\n    window.addEventListener('resize', this.resizeListener);\n\n    // Obtain current options based on matching media queries (if responsive options are given)\n    // This will also register a listener that is re-creating the chart based on media changes\n    this.optionsProvider = Chartist.optionsProvider(this.options, this.responsiveOptions, this.eventEmitter);\n    // Register options change listener that will trigger a chart update\n    this.eventEmitter.addEventHandler('optionsChanged', function() {\n      this.update();\n    }.bind(this));\n\n    // Before the first chart creation we need to register us with all plugins that are configured\n    // Initialize all relevant plugins with our chart object and the plugin options specified in the config\n    if(this.options.plugins) {\n      this.options.plugins.forEach(function(plugin) {\n        if(plugin instanceof Array) {\n          plugin[0](this, plugin[1]);\n        } else {\n          plugin(this);\n        }\n      }.bind(this));\n    }\n\n    // Event for data transformation that allows to manipulate the data before it gets rendered in the charts\n    this.eventEmitter.emit('data', {\n      type: 'initial',\n      data: this.data\n    });\n\n    // Create the first chart\n    this.createChart(this.optionsProvider.getCurrentOptions());\n\n    // As chart is initialized from the event loop now we can reset our timeout reference\n    // This is important if the chart gets initialized on the same element twice\n    this.initializeTimeoutId = undefined;\n  }\n\n  /**\n   * Constructor of chart base class.\n   *\n   * @param query\n   * @param data\n   * @param defaultOptions\n   * @param options\n   * @param responsiveOptions\n   * @constructor\n   */\n  function Base(query, data, defaultOptions, options, responsiveOptions) {\n    this.container = Chartist.querySelector(query);\n    this.data = data || {};\n    this.data.labels = this.data.labels || [];\n    this.data.series = this.data.series || [];\n    this.defaultOptions = defaultOptions;\n    this.options = options;\n    this.responsiveOptions = responsiveOptions;\n    this.eventEmitter = Chartist.EventEmitter();\n    this.supportsForeignObject = Chartist.Svg.isSupported('Extensibility');\n    this.supportsAnimations = Chartist.Svg.isSupported('AnimationEventsAttribute');\n    this.resizeListener = function resizeListener(){\n      this.update();\n    }.bind(this);\n\n    if(this.container) {\n      // If chartist was already initialized in this container we are detaching all event listeners first\n      if(this.container.__chartist__) {\n        this.container.__chartist__.detach();\n      }\n\n      this.container.__chartist__ = this;\n    }\n\n    // Using event loop for first draw to make it possible to register event listeners in the same call stack where\n    // the chart was created.\n    this.initializeTimeoutId = setTimeout(initialize.bind(this), 0);\n  }\n\n  // Creating the chart base class\n  Chartist.Base = Chartist.Class.extend({\n    constructor: Base,\n    optionsProvider: undefined,\n    container: undefined,\n    svg: undefined,\n    eventEmitter: undefined,\n    createChart: function() {\n      throw new Error('Base chart type can\\'t be instantiated!');\n    },\n    update: update,\n    detach: detach,\n    on: on,\n    off: off,\n    version: Chartist.version,\n    supportsForeignObject: false\n  });\n\n}(this || global, Chartist));\n;/**\n * Chartist SVG module for simple SVG DOM abstraction\n *\n * @module Chartist.Svg\n */\n/* global Chartist */\n(function(globalRoot, Chartist) {\n  'use strict';\n\n  var document = globalRoot.document;\n\n  /**\n   * Chartist.Svg creates a new SVG object wrapper with a starting element. You can use the wrapper to fluently create sub-elements and modify them.\n   *\n   * @memberof Chartist.Svg\n   * @constructor\n   * @param {String|Element} name The name of the SVG element to create or an SVG dom element which should be wrapped into Chartist.Svg\n   * @param {Object} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n   * @param {String} className This class or class list will be added to the SVG element\n   * @param {Object} parent The parent SVG wrapper object where this newly created wrapper and it's element will be attached to as child\n   * @param {Boolean} insertFirst If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n   */\n  function Svg(name, attributes, className, parent, insertFirst) {\n    // If Svg is getting called with an SVG element we just return the wrapper\n    if(name instanceof Element) {\n      this._node = name;\n    } else {\n      this._node = document.createElementNS(Chartist.namespaces.svg, name);\n\n      // If this is an SVG element created then custom namespace\n      if(name === 'svg') {\n        this.attr({\n          'xmlns:ct': Chartist.namespaces.ct\n        });\n      }\n    }\n\n    if(attributes) {\n      this.attr(attributes);\n    }\n\n    if(className) {\n      this.addClass(className);\n    }\n\n    if(parent) {\n      if (insertFirst && parent._node.firstChild) {\n        parent._node.insertBefore(this._node, parent._node.firstChild);\n      } else {\n        parent._node.appendChild(this._node);\n      }\n    }\n  }\n\n  /**\n   * Set attributes on the current SVG element of the wrapper you're currently working on.\n   *\n   * @memberof Chartist.Svg\n   * @param {Object|String} attributes An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added. If this parameter is a String then the function is used as a getter and will return the attribute value.\n   * @param {String} [ns] If specified, the attribute will be obtained using getAttributeNs. In order to write namepsaced attributes you can use the namespace:attribute notation within the attributes object.\n   * @return {Object|String} The current wrapper object will be returned so it can be used for chaining or the attribute value if used as getter function.\n   */\n  function attr(attributes, ns) {\n    if(typeof attributes === 'string') {\n      if(ns) {\n        return this._node.getAttributeNS(ns, attributes);\n      } else {\n        return this._node.getAttribute(attributes);\n      }\n    }\n\n    Object.keys(attributes).forEach(function(key) {\n      // If the attribute value is undefined we can skip this one\n      if(attributes[key] === undefined) {\n        return;\n      }\n\n      if (key.indexOf(':') !== -1) {\n        var namespacedAttribute = key.split(':');\n        this._node.setAttributeNS(Chartist.namespaces[namespacedAttribute[0]], key, attributes[key]);\n      } else {\n        this._node.setAttribute(key, attributes[key]);\n      }\n    }.bind(this));\n\n    return this;\n  }\n\n  /**\n   * Create a new SVG element whose wrapper object will be selected for further operations. This way you can also create nested groups easily.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} name The name of the SVG element that should be created as child element of the currently selected element wrapper\n   * @param {Object} [attributes] An object with properties that will be added as attributes to the SVG element that is created. Attributes with undefined values will not be added.\n   * @param {String} [className] This class or class list will be added to the SVG element\n   * @param {Boolean} [insertFirst] If this param is set to true in conjunction with a parent element the newly created element will be added as first child element in the parent element\n   * @return {Chartist.Svg} Returns a Chartist.Svg wrapper object that can be used to modify the containing SVG data\n   */\n  function elem(name, attributes, className, insertFirst) {\n    return new Chartist.Svg(name, attributes, className, this, insertFirst);\n  }\n\n  /**\n   * Returns the parent Chartist.SVG wrapper object\n   *\n   * @memberof Chartist.Svg\n   * @return {Chartist.Svg} Returns a Chartist.Svg wrapper around the parent node of the current node. If the parent node is not existing or it's not an SVG node then this function will return null.\n   */\n  function parent() {\n    return this._node.parentNode instanceof SVGElement ? new Chartist.Svg(this._node.parentNode) : null;\n  }\n\n  /**\n   * This method returns a Chartist.Svg wrapper around the root SVG element of the current tree.\n   *\n   * @memberof Chartist.Svg\n   * @return {Chartist.Svg} The root SVG element wrapped in a Chartist.Svg element\n   */\n  function root() {\n    var node = this._node;\n    while(node.nodeName !== 'svg') {\n      node = node.parentNode;\n    }\n    return new Chartist.Svg(node);\n  }\n\n  /**\n   * Find the first child SVG element of the current element that matches a CSS selector. The returned object is a Chartist.Svg wrapper.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} selector A CSS selector that is used to query for child SVG elements\n   * @return {Chartist.Svg} The SVG wrapper for the element found or null if no element was found\n   */\n  function querySelector(selector) {\n    var foundNode = this._node.querySelector(selector);\n    return foundNode ? new Chartist.Svg(foundNode) : null;\n  }\n\n  /**\n   * Find the all child SVG elements of the current element that match a CSS selector. The returned object is a Chartist.Svg.List wrapper.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} selector A CSS selector that is used to query for child SVG elements\n   * @return {Chartist.Svg.List} The SVG wrapper list for the element found or null if no element was found\n   */\n  function querySelectorAll(selector) {\n    var foundNodes = this._node.querySelectorAll(selector);\n    return foundNodes.length ? new Chartist.Svg.List(foundNodes) : null;\n  }\n\n  /**\n   * Returns the underlying SVG node for the current element.\n   *\n   * @memberof Chartist.Svg\n   * @returns {Node}\n   */\n  function getNode() {\n    return this._node;\n  }\n\n  /**\n   * This method creates a foreignObject (see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/foreignObject) that allows to embed HTML content into a SVG graphic. With the help of foreignObjects you can enable the usage of regular HTML elements inside of SVG where they are subject for SVG positioning and transformation but the Browser will use the HTML rendering capabilities for the containing DOM.\n   *\n   * @memberof Chartist.Svg\n   * @param {Node|String} content The DOM Node, or HTML string that will be converted to a DOM Node, that is then placed into and wrapped by the foreignObject\n   * @param {String} [attributes] An object with properties that will be added as attributes to the foreignObject element that is created. Attributes with undefined values will not be added.\n   * @param {String} [className] This class or class list will be added to the SVG element\n   * @param {Boolean} [insertFirst] Specifies if the foreignObject should be inserted as first child\n   * @return {Chartist.Svg} New wrapper object that wraps the foreignObject element\n   */\n  function foreignObject(content, attributes, className, insertFirst) {\n    // If content is string then we convert it to DOM\n    // TODO: Handle case where content is not a string nor a DOM Node\n    if(typeof content === 'string') {\n      var container = document.createElement('div');\n      container.innerHTML = content;\n      content = container.firstChild;\n    }\n\n    // Adding namespace to content element\n    content.setAttribute('xmlns', Chartist.namespaces.xmlns);\n\n    // Creating the foreignObject without required extension attribute (as described here\n    // http://www.w3.org/TR/SVG/extend.html#ForeignObjectElement)\n    var fnObj = this.elem('foreignObject', attributes, className, insertFirst);\n\n    // Add content to foreignObjectElement\n    fnObj._node.appendChild(content);\n\n    return fnObj;\n  }\n\n  /**\n   * This method adds a new text element to the current Chartist.Svg wrapper.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} t The text that should be added to the text element that is created\n   * @return {Chartist.Svg} The same wrapper object that was used to add the newly created element\n   */\n  function text(t) {\n    this._node.appendChild(document.createTextNode(t));\n    return this;\n  }\n\n  /**\n   * This method will clear all child nodes of the current wrapper object.\n   *\n   * @memberof Chartist.Svg\n   * @return {Chartist.Svg} The same wrapper object that got emptied\n   */\n  function empty() {\n    while (this._node.firstChild) {\n      this._node.removeChild(this._node.firstChild);\n    }\n\n    return this;\n  }\n\n  /**\n   * This method will cause the current wrapper to remove itself from its parent wrapper. Use this method if you'd like to get rid of an element in a given DOM structure.\n   *\n   * @memberof Chartist.Svg\n   * @return {Chartist.Svg} The parent wrapper object of the element that got removed\n   */\n  function remove() {\n    this._node.parentNode.removeChild(this._node);\n    return this.parent();\n  }\n\n  /**\n   * This method will replace the element with a new element that can be created outside of the current DOM.\n   *\n   * @memberof Chartist.Svg\n   * @param {Chartist.Svg} newElement The new Chartist.Svg object that will be used to replace the current wrapper object\n   * @return {Chartist.Svg} The wrapper of the new element\n   */\n  function replace(newElement) {\n    this._node.parentNode.replaceChild(newElement._node, this._node);\n    return newElement;\n  }\n\n  /**\n   * This method will append an element to the current element as a child.\n   *\n   * @memberof Chartist.Svg\n   * @param {Chartist.Svg} element The Chartist.Svg element that should be added as a child\n   * @param {Boolean} [insertFirst] Specifies if the element should be inserted as first child\n   * @return {Chartist.Svg} The wrapper of the appended object\n   */\n  function append(element, insertFirst) {\n    if(insertFirst && this._node.firstChild) {\n      this._node.insertBefore(element._node, this._node.firstChild);\n    } else {\n      this._node.appendChild(element._node);\n    }\n\n    return this;\n  }\n\n  /**\n   * Returns an array of class names that are attached to the current wrapper element. This method can not be chained further.\n   *\n   * @memberof Chartist.Svg\n   * @return {Array} A list of classes or an empty array if there are no classes on the current element\n   */\n  function classes() {\n    return this._node.getAttribute('class') ? this._node.getAttribute('class').trim().split(/\\s+/) : [];\n  }\n\n  /**\n   * Adds one or a space separated list of classes to the current element and ensures the classes are only existing once.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} names A white space separated list of class names\n   * @return {Chartist.Svg} The wrapper of the current element\n   */\n  function addClass(names) {\n    this._node.setAttribute('class',\n      this.classes(this._node)\n        .concat(names.trim().split(/\\s+/))\n        .filter(function(elem, pos, self) {\n          return self.indexOf(elem) === pos;\n        }).join(' ')\n    );\n\n    return this;\n  }\n\n  /**\n   * Removes one or a space separated list of classes from the current element.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} names A white space separated list of class names\n   * @return {Chartist.Svg} The wrapper of the current element\n   */\n  function removeClass(names) {\n    var removedClasses = names.trim().split(/\\s+/);\n\n    this._node.setAttribute('class', this.classes(this._node).filter(function(name) {\n      return removedClasses.indexOf(name) === -1;\n    }).join(' '));\n\n    return this;\n  }\n\n  /**\n   * Removes all classes from the current element.\n   *\n   * @memberof Chartist.Svg\n   * @return {Chartist.Svg} The wrapper of the current element\n   */\n  function removeAllClasses() {\n    this._node.setAttribute('class', '');\n\n    return this;\n  }\n\n  /**\n   * Get element height using `getBoundingClientRect`\n   *\n   * @memberof Chartist.Svg\n   * @return {Number} The elements height in pixels\n   */\n  function height() {\n    return this._node.getBoundingClientRect().height;\n  }\n\n  /**\n   * Get element width using `getBoundingClientRect`\n   *\n   * @memberof Chartist.Core\n   * @return {Number} The elements width in pixels\n   */\n  function width() {\n    return this._node.getBoundingClientRect().width;\n  }\n\n  /**\n   * The animate function lets you animate the current element with SMIL animations. You can add animations for multiple attributes at the same time by using an animation definition object. This object should contain SMIL animation attributes. Please refer to http://www.w3.org/TR/SVG/animate.html for a detailed specification about the available animation attributes. Additionally an easing property can be passed in the animation definition object. This can be a string with a name of an easing function in `Chartist.Svg.Easing` or an array with four numbers specifying a cubic Bézier curve.\n   * **An animations object could look like this:**\n   * ```javascript\n   * element.animate({\n   *   opacity: {\n   *     dur: 1000,\n   *     from: 0,\n   *     to: 1\n   *   },\n   *   x1: {\n   *     dur: '1000ms',\n   *     from: 100,\n   *     to: 200,\n   *     easing: 'easeOutQuart'\n   *   },\n   *   y1: {\n   *     dur: '2s',\n   *     from: 0,\n   *     to: 100\n   *   }\n   * });\n   * ```\n   * **Automatic unit conversion**\n   * For the `dur` and the `begin` animate attribute you can also omit a unit by passing a number. The number will automatically be converted to milli seconds.\n   * **Guided mode**\n   * The default behavior of SMIL animations with offset using the `begin` attribute is that the attribute will keep it's original value until the animation starts. Mostly this behavior is not desired as you'd like to have your element attributes already initialized with the animation `from` value even before the animation starts. Also if you don't specify `fill=\"freeze\"` on an animate element or if you delete the animation after it's done (which is done in guided mode) the attribute will switch back to the initial value. This behavior is also not desired when performing simple one-time animations. For one-time animations you'd want to trigger animations immediately instead of relative to the document begin time. That's why in guided mode Chartist.Svg will also use the `begin` property to schedule a timeout and manually start the animation after the timeout. If you're using multiple SMIL definition objects for an attribute (in an array), guided mode will be disabled for this attribute, even if you explicitly enabled it.\n   * If guided mode is enabled the following behavior is added:\n   * - Before the animation starts (even when delayed with `begin`) the animated attribute will be set already to the `from` value of the animation\n   * - `begin` is explicitly set to `indefinite` so it can be started manually without relying on document begin time (creation)\n   * - The animate element will be forced to use `fill=\"freeze\"`\n   * - The animation will be triggered with `beginElement()` in a timeout where `begin` of the definition object is interpreted in milli seconds. If no `begin` was specified the timeout is triggered immediately.\n   * - After the animation the element attribute value will be set to the `to` value of the animation\n   * - The animate element is deleted from the DOM\n   *\n   * @memberof Chartist.Svg\n   * @param {Object} animations An animations object where the property keys are the attributes you'd like to animate. The properties should be objects again that contain the SMIL animation attributes (usually begin, dur, from, and to). The property begin and dur is auto converted (see Automatic unit conversion). You can also schedule multiple animations for the same attribute by passing an Array of SMIL definition objects. Attributes that contain an array of SMIL definition objects will not be executed in guided mode.\n   * @param {Boolean} guided Specify if guided mode should be activated for this animation (see Guided mode). If not otherwise specified, guided mode will be activated.\n   * @param {Object} eventEmitter If specified, this event emitter will be notified when an animation starts or ends.\n   * @return {Chartist.Svg} The current element where the animation was added\n   */\n  function animate(animations, guided, eventEmitter) {\n    if(guided === undefined) {\n      guided = true;\n    }\n\n    Object.keys(animations).forEach(function createAnimateForAttributes(attribute) {\n\n      function createAnimate(animationDefinition, guided) {\n        var attributeProperties = {},\n          animate,\n          timeout,\n          easing;\n\n        // Check if an easing is specified in the definition object and delete it from the object as it will not\n        // be part of the animate element attributes.\n        if(animationDefinition.easing) {\n          // If already an easing Bézier curve array we take it or we lookup a easing array in the Easing object\n          easing = animationDefinition.easing instanceof Array ?\n            animationDefinition.easing :\n            Chartist.Svg.Easing[animationDefinition.easing];\n          delete animationDefinition.easing;\n        }\n\n        // If numeric dur or begin was provided we assume milli seconds\n        animationDefinition.begin = Chartist.ensureUnit(animationDefinition.begin, 'ms');\n        animationDefinition.dur = Chartist.ensureUnit(animationDefinition.dur, 'ms');\n\n        if(easing) {\n          animationDefinition.calcMode = 'spline';\n          animationDefinition.keySplines = easing.join(' ');\n          animationDefinition.keyTimes = '0;1';\n        }\n\n        // Adding \"fill: freeze\" if we are in guided mode and set initial attribute values\n        if(guided) {\n          animationDefinition.fill = 'freeze';\n          // Animated property on our element should already be set to the animation from value in guided mode\n          attributeProperties[attribute] = animationDefinition.from;\n          this.attr(attributeProperties);\n\n          // In guided mode we also set begin to indefinite so we can trigger the start manually and put the begin\n          // which needs to be in ms aside\n          timeout = Chartist.quantity(animationDefinition.begin || 0).value;\n          animationDefinition.begin = 'indefinite';\n        }\n\n        animate = this.elem('animate', Chartist.extend({\n          attributeName: attribute\n        }, animationDefinition));\n\n        if(guided) {\n          // If guided we take the value that was put aside in timeout and trigger the animation manually with a timeout\n          setTimeout(function() {\n            // If beginElement fails we set the animated attribute to the end position and remove the animate element\n            // This happens if the SMIL ElementTimeControl interface is not supported or any other problems occured in\n            // the browser. (Currently FF 34 does not support animate elements in foreignObjects)\n            try {\n              animate._node.beginElement();\n            } catch(err) {\n              // Set animated attribute to current animated value\n              attributeProperties[attribute] = animationDefinition.to;\n              this.attr(attributeProperties);\n              // Remove the animate element as it's no longer required\n              animate.remove();\n            }\n          }.bind(this), timeout);\n        }\n\n        if(eventEmitter) {\n          animate._node.addEventListener('beginEvent', function handleBeginEvent() {\n            eventEmitter.emit('animationBegin', {\n              element: this,\n              animate: animate._node,\n              params: animationDefinition\n            });\n          }.bind(this));\n        }\n\n        animate._node.addEventListener('endEvent', function handleEndEvent() {\n          if(eventEmitter) {\n            eventEmitter.emit('animationEnd', {\n              element: this,\n              animate: animate._node,\n              params: animationDefinition\n            });\n          }\n\n          if(guided) {\n            // Set animated attribute to current animated value\n            attributeProperties[attribute] = animationDefinition.to;\n            this.attr(attributeProperties);\n            // Remove the animate element as it's no longer required\n            animate.remove();\n          }\n        }.bind(this));\n      }\n\n      // If current attribute is an array of definition objects we create an animate for each and disable guided mode\n      if(animations[attribute] instanceof Array) {\n        animations[attribute].forEach(function(animationDefinition) {\n          createAnimate.bind(this)(animationDefinition, false);\n        }.bind(this));\n      } else {\n        createAnimate.bind(this)(animations[attribute], guided);\n      }\n\n    }.bind(this));\n\n    return this;\n  }\n\n  Chartist.Svg = Chartist.Class.extend({\n    constructor: Svg,\n    attr: attr,\n    elem: elem,\n    parent: parent,\n    root: root,\n    querySelector: querySelector,\n    querySelectorAll: querySelectorAll,\n    getNode: getNode,\n    foreignObject: foreignObject,\n    text: text,\n    empty: empty,\n    remove: remove,\n    replace: replace,\n    append: append,\n    classes: classes,\n    addClass: addClass,\n    removeClass: removeClass,\n    removeAllClasses: removeAllClasses,\n    height: height,\n    width: width,\n    animate: animate\n  });\n\n  /**\n   * This method checks for support of a given SVG feature like Extensibility, SVG-animation or the like. Check http://www.w3.org/TR/SVG11/feature for a detailed list.\n   *\n   * @memberof Chartist.Svg\n   * @param {String} feature The SVG 1.1 feature that should be checked for support.\n   * @return {Boolean} True of false if the feature is supported or not\n   */\n  Chartist.Svg.isSupported = function(feature) {\n    return document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#' + feature, '1.1');\n  };\n\n  /**\n   * This Object contains some standard easing cubic bezier curves. Then can be used with their name in the `Chartist.Svg.animate`. You can also extend the list and use your own name in the `animate` function. Click the show code button to see the available bezier functions.\n   *\n   * @memberof Chartist.Svg\n   */\n  var easingCubicBeziers = {\n    easeInSine: [0.47, 0, 0.745, 0.715],\n    easeOutSine: [0.39, 0.575, 0.565, 1],\n    easeInOutSine: [0.445, 0.05, 0.55, 0.95],\n    easeInQuad: [0.55, 0.085, 0.68, 0.53],\n    easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n    easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n    easeInCubic: [0.55, 0.055, 0.675, 0.19],\n    easeOutCubic: [0.215, 0.61, 0.355, 1],\n    easeInOutCubic: [0.645, 0.045, 0.355, 1],\n    easeInQuart: [0.895, 0.03, 0.685, 0.22],\n    easeOutQuart: [0.165, 0.84, 0.44, 1],\n    easeInOutQuart: [0.77, 0, 0.175, 1],\n    easeInQuint: [0.755, 0.05, 0.855, 0.06],\n    easeOutQuint: [0.23, 1, 0.32, 1],\n    easeInOutQuint: [0.86, 0, 0.07, 1],\n    easeInExpo: [0.95, 0.05, 0.795, 0.035],\n    easeOutExpo: [0.19, 1, 0.22, 1],\n    easeInOutExpo: [1, 0, 0, 1],\n    easeInCirc: [0.6, 0.04, 0.98, 0.335],\n    easeOutCirc: [0.075, 0.82, 0.165, 1],\n    easeInOutCirc: [0.785, 0.135, 0.15, 0.86],\n    easeInBack: [0.6, -0.28, 0.735, 0.045],\n    easeOutBack: [0.175, 0.885, 0.32, 1.275],\n    easeInOutBack: [0.68, -0.55, 0.265, 1.55]\n  };\n\n  Chartist.Svg.Easing = easingCubicBeziers;\n\n  /**\n   * This helper class is to wrap multiple `Chartist.Svg` elements into a list where you can call the `Chartist.Svg` functions on all elements in the list with one call. This is helpful when you'd like to perform calls with `Chartist.Svg` on multiple elements.\n   * An instance of this class is also returned by `Chartist.Svg.querySelectorAll`.\n   *\n   * @memberof Chartist.Svg\n   * @param {Array<Node>|NodeList} nodeList An Array of SVG DOM nodes or a SVG DOM NodeList (as returned by document.querySelectorAll)\n   * @constructor\n   */\n  function SvgList(nodeList) {\n    var list = this;\n\n    this.svgElements = [];\n    for(var i = 0; i < nodeList.length; i++) {\n      this.svgElements.push(new Chartist.Svg(nodeList[i]));\n    }\n\n    // Add delegation methods for Chartist.Svg\n    Object.keys(Chartist.Svg.prototype).filter(function(prototypeProperty) {\n      return ['constructor',\n          'parent',\n          'querySelector',\n          'querySelectorAll',\n          'replace',\n          'append',\n          'classes',\n          'height',\n          'width'].indexOf(prototypeProperty) === -1;\n    }).forEach(function(prototypeProperty) {\n      list[prototypeProperty] = function() {\n        var args = Array.prototype.slice.call(arguments, 0);\n        list.svgElements.forEach(function(element) {\n          Chartist.Svg.prototype[prototypeProperty].apply(element, args);\n        });\n        return list;\n      };\n    });\n  }\n\n  Chartist.Svg.List = Chartist.Class.extend({\n    constructor: SvgList\n  });\n}(this || global, Chartist));\n;/**\n * Chartist SVG path module for SVG path description creation and modification.\n *\n * @module Chartist.Svg.Path\n */\n/* global Chartist */\n(function(globalRoot, Chartist) {\n  'use strict';\n\n  /**\n   * Contains the descriptors of supported element types in a SVG path. Currently only move, line and curve are supported.\n   *\n   * @memberof Chartist.Svg.Path\n   * @type {Object}\n   */\n  var elementDescriptions = {\n    m: ['x', 'y'],\n    l: ['x', 'y'],\n    c: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n    a: ['rx', 'ry', 'xAr', 'lAf', 'sf', 'x', 'y']\n  };\n\n  /**\n   * Default options for newly created SVG path objects.\n   *\n   * @memberof Chartist.Svg.Path\n   * @type {Object}\n   */\n  var defaultOptions = {\n    // The accuracy in digit count after the decimal point. This will be used to round numbers in the SVG path. If this option is set to false then no rounding will be performed.\n    accuracy: 3\n  };\n\n  function element(command, params, pathElements, pos, relative, data) {\n    var pathElement = Chartist.extend({\n      command: relative ? command.toLowerCase() : command.toUpperCase()\n    }, params, data ? { data: data } : {} );\n\n    pathElements.splice(pos, 0, pathElement);\n  }\n\n  function forEachParam(pathElements, cb) {\n    pathElements.forEach(function(pathElement, pathElementIndex) {\n      elementDescriptions[pathElement.command.toLowerCase()].forEach(function(paramName, paramIndex) {\n        cb(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n      });\n    });\n  }\n\n  /**\n   * Used to construct a new path object.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Boolean} close If set to true then this path will be closed when stringified (with a Z at the end)\n   * @param {Object} options Options object that overrides the default objects. See default options for more details.\n   * @constructor\n   */\n  function SvgPath(close, options) {\n    this.pathElements = [];\n    this.pos = 0;\n    this.close = close;\n    this.options = Chartist.extend({}, defaultOptions, options);\n  }\n\n  /**\n   * Gets or sets the current position (cursor) inside of the path. You can move around the cursor freely but limited to 0 or the count of existing elements. All modifications with element functions will insert new elements at the position of this cursor.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} [pos] If a number is passed then the cursor is set to this position in the path element array.\n   * @return {Chartist.Svg.Path|Number} If the position parameter was passed then the return value will be the path object for easy call chaining. If no position parameter was passed then the current position is returned.\n   */\n  function position(pos) {\n    if(pos !== undefined) {\n      this.pos = Math.max(0, Math.min(this.pathElements.length, pos));\n      return this;\n    } else {\n      return this.pos;\n    }\n  }\n\n  /**\n   * Removes elements from the path starting at the current position.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} count Number of path elements that should be removed from the current position.\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function remove(count) {\n    this.pathElements.splice(this.pos, count);\n    return this;\n  }\n\n  /**\n   * Use this function to add a new move SVG path element.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} x The x coordinate for the move element.\n   * @param {Number} y The y coordinate for the move element.\n   * @param {Boolean} [relative] If set to true the move element will be created with relative coordinates (lowercase letter)\n   * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function move(x, y, relative, data) {\n    element('M', {\n      x: +x,\n      y: +y\n    }, this.pathElements, this.pos++, relative, data);\n    return this;\n  }\n\n  /**\n   * Use this function to add a new line SVG path element.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} x The x coordinate for the line element.\n   * @param {Number} y The y coordinate for the line element.\n   * @param {Boolean} [relative] If set to true the line element will be created with relative coordinates (lowercase letter)\n   * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function line(x, y, relative, data) {\n    element('L', {\n      x: +x,\n      y: +y\n    }, this.pathElements, this.pos++, relative, data);\n    return this;\n  }\n\n  /**\n   * Use this function to add a new curve SVG path element.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} x1 The x coordinate for the first control point of the bezier curve.\n   * @param {Number} y1 The y coordinate for the first control point of the bezier curve.\n   * @param {Number} x2 The x coordinate for the second control point of the bezier curve.\n   * @param {Number} y2 The y coordinate for the second control point of the bezier curve.\n   * @param {Number} x The x coordinate for the target point of the curve element.\n   * @param {Number} y The y coordinate for the target point of the curve element.\n   * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n   * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function curve(x1, y1, x2, y2, x, y, relative, data) {\n    element('C', {\n      x1: +x1,\n      y1: +y1,\n      x2: +x2,\n      y2: +y2,\n      x: +x,\n      y: +y\n    }, this.pathElements, this.pos++, relative, data);\n    return this;\n  }\n\n  /**\n   * Use this function to add a new non-bezier curve SVG path element.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} rx The radius to be used for the x-axis of the arc.\n   * @param {Number} ry The radius to be used for the y-axis of the arc.\n   * @param {Number} xAr Defines the orientation of the arc\n   * @param {Number} lAf Large arc flag\n   * @param {Number} sf Sweep flag\n   * @param {Number} x The x coordinate for the target point of the curve element.\n   * @param {Number} y The y coordinate for the target point of the curve element.\n   * @param {Boolean} [relative] If set to true the curve element will be created with relative coordinates (lowercase letter)\n   * @param {*} [data] Any data that should be stored with the element object that will be accessible in pathElement\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function arc(rx, ry, xAr, lAf, sf, x, y, relative, data) {\n    element('A', {\n      rx: +rx,\n      ry: +ry,\n      xAr: +xAr,\n      lAf: +lAf,\n      sf: +sf,\n      x: +x,\n      y: +y\n    }, this.pathElements, this.pos++, relative, data);\n    return this;\n  }\n\n  /**\n   * Parses an SVG path seen in the d attribute of path elements, and inserts the parsed elements into the existing path object at the current cursor position. Any closing path indicators (Z at the end of the path) will be ignored by the parser as this is provided by the close option in the options of the path object.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {String} path Any SVG path that contains move (m), line (l) or curve (c) components.\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function parse(path) {\n    // Parsing the SVG path string into an array of arrays [['M', '10', '10'], ['L', '100', '100']]\n    var chunks = path.replace(/([A-Za-z])([0-9])/g, '$1 $2')\n      .replace(/([0-9])([A-Za-z])/g, '$1 $2')\n      .split(/[\\s,]+/)\n      .reduce(function(result, element) {\n        if(element.match(/[A-Za-z]/)) {\n          result.push([]);\n        }\n\n        result[result.length - 1].push(element);\n        return result;\n      }, []);\n\n    // If this is a closed path we remove the Z at the end because this is determined by the close option\n    if(chunks[chunks.length - 1][0].toUpperCase() === 'Z') {\n      chunks.pop();\n    }\n\n    // Using svgPathElementDescriptions to map raw path arrays into objects that contain the command and the parameters\n    // For example {command: 'M', x: '10', y: '10'}\n    var elements = chunks.map(function(chunk) {\n        var command = chunk.shift(),\n          description = elementDescriptions[command.toLowerCase()];\n\n        return Chartist.extend({\n          command: command\n        }, description.reduce(function(result, paramName, index) {\n          result[paramName] = +chunk[index];\n          return result;\n        }, {}));\n      });\n\n    // Preparing a splice call with the elements array as var arg params and insert the parsed elements at the current position\n    var spliceArgs = [this.pos, 0];\n    Array.prototype.push.apply(spliceArgs, elements);\n    Array.prototype.splice.apply(this.pathElements, spliceArgs);\n    // Increase the internal position by the element count\n    this.pos += elements.length;\n\n    return this;\n  }\n\n  /**\n   * This function renders to current SVG path object into a final SVG string that can be used in the d attribute of SVG path elements. It uses the accuracy option to round big decimals. If the close parameter was set in the constructor of this path object then a path closing Z will be appended to the output string.\n   *\n   * @memberof Chartist.Svg.Path\n   * @return {String}\n   */\n  function stringify() {\n    var accuracyMultiplier = Math.pow(10, this.options.accuracy);\n\n    return this.pathElements.reduce(function(path, pathElement) {\n        var params = elementDescriptions[pathElement.command.toLowerCase()].map(function(paramName) {\n          return this.options.accuracy ?\n            (Math.round(pathElement[paramName] * accuracyMultiplier) / accuracyMultiplier) :\n            pathElement[paramName];\n        }.bind(this));\n\n        return path + pathElement.command + params.join(',');\n      }.bind(this), '') + (this.close ? 'Z' : '');\n  }\n\n  /**\n   * Scales all elements in the current SVG path object. There is an individual parameter for each coordinate. Scaling will also be done for control points of curves, affecting the given coordinate.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} x The number which will be used to scale the x, x1 and x2 of all path elements.\n   * @param {Number} y The number which will be used to scale the y, y1 and y2 of all path elements.\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function scale(x, y) {\n    forEachParam(this.pathElements, function(pathElement, paramName) {\n      pathElement[paramName] *= paramName[0] === 'x' ? x : y;\n    });\n    return this;\n  }\n\n  /**\n   * Translates all elements in the current SVG path object. The translation is relative and there is an individual parameter for each coordinate. Translation will also be done for control points of curves, affecting the given coordinate.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Number} x The number which will be used to translate the x, x1 and x2 of all path elements.\n   * @param {Number} y The number which will be used to translate the y, y1 and y2 of all path elements.\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function translate(x, y) {\n    forEachParam(this.pathElements, function(pathElement, paramName) {\n      pathElement[paramName] += paramName[0] === 'x' ? x : y;\n    });\n    return this;\n  }\n\n  /**\n   * This function will run over all existing path elements and then loop over their attributes. The callback function will be called for every path element attribute that exists in the current path.\n   * The method signature of the callback function looks like this:\n   * ```javascript\n   * function(pathElement, paramName, pathElementIndex, paramIndex, pathElements)\n   * ```\n   * If something else than undefined is returned by the callback function, this value will be used to replace the old value. This allows you to build custom transformations of path objects that can't be achieved using the basic transformation functions scale and translate.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Function} transformFnc The callback function for the transformation. Check the signature in the function description.\n   * @return {Chartist.Svg.Path} The current path object for easy call chaining.\n   */\n  function transform(transformFnc) {\n    forEachParam(this.pathElements, function(pathElement, paramName, pathElementIndex, paramIndex, pathElements) {\n      var transformed = transformFnc(pathElement, paramName, pathElementIndex, paramIndex, pathElements);\n      if(transformed || transformed === 0) {\n        pathElement[paramName] = transformed;\n      }\n    });\n    return this;\n  }\n\n  /**\n   * This function clones a whole path object with all its properties. This is a deep clone and path element objects will also be cloned.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Boolean} [close] Optional option to set the new cloned path to closed. If not specified or false, the original path close option will be used.\n   * @return {Chartist.Svg.Path}\n   */\n  function clone(close) {\n    var c = new Chartist.Svg.Path(close || this.close);\n    c.pos = this.pos;\n    c.pathElements = this.pathElements.slice().map(function cloneElements(pathElement) {\n      return Chartist.extend({}, pathElement);\n    });\n    c.options = Chartist.extend({}, this.options);\n    return c;\n  }\n\n  /**\n   * Split a Svg.Path object by a specific command in the path chain. The path chain will be split and an array of newly created paths objects will be returned. This is useful if you'd like to split an SVG path by it's move commands, for example, in order to isolate chunks of drawings.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {String} command The command you'd like to use to split the path\n   * @return {Array<Chartist.Svg.Path>}\n   */\n  function splitByCommand(command) {\n    var split = [\n      new Chartist.Svg.Path()\n    ];\n\n    this.pathElements.forEach(function(pathElement) {\n      if(pathElement.command === command.toUpperCase() && split[split.length - 1].pathElements.length !== 0) {\n        split.push(new Chartist.Svg.Path());\n      }\n\n      split[split.length - 1].pathElements.push(pathElement);\n    });\n\n    return split;\n  }\n\n  /**\n   * This static function on `Chartist.Svg.Path` is joining multiple paths together into one paths.\n   *\n   * @memberof Chartist.Svg.Path\n   * @param {Array<Chartist.Svg.Path>} paths A list of paths to be joined together. The order is important.\n   * @param {boolean} close If the newly created path should be a closed path\n   * @param {Object} options Path options for the newly created path.\n   * @return {Chartist.Svg.Path}\n   */\n\n  function join(paths, close, options) {\n    var joinedPath = new Chartist.Svg.Path(close, options);\n    for(var i = 0; i < paths.length; i++) {\n      var path = paths[i];\n      for(var j = 0; j < path.pathElements.length; j++) {\n        joinedPath.pathElements.push(path.pathElements[j]);\n      }\n    }\n    return joinedPath;\n  }\n\n  Chartist.Svg.Path = Chartist.Class.extend({\n    constructor: SvgPath,\n    position: position,\n    remove: remove,\n    move: move,\n    line: line,\n    curve: curve,\n    arc: arc,\n    scale: scale,\n    translate: translate,\n    transform: transform,\n    parse: parse,\n    stringify: stringify,\n    clone: clone,\n    splitByCommand: splitByCommand\n  });\n\n  Chartist.Svg.Path.elementDescriptions = elementDescriptions;\n  Chartist.Svg.Path.join = join;\n}(this || global, Chartist));\n;/* global Chartist */\n(function (globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  var axisUnits = {\n    x: {\n      pos: 'x',\n      len: 'width',\n      dir: 'horizontal',\n      rectStart: 'x1',\n      rectEnd: 'x2',\n      rectOffset: 'y2'\n    },\n    y: {\n      pos: 'y',\n      len: 'height',\n      dir: 'vertical',\n      rectStart: 'y2',\n      rectEnd: 'y1',\n      rectOffset: 'x1'\n    }\n  };\n\n  function Axis(units, chartRect, ticks, options) {\n    this.units = units;\n    this.counterUnits = units === axisUnits.x ? axisUnits.y : axisUnits.x;\n    this.chartRect = chartRect;\n    this.axisLength = chartRect[units.rectEnd] - chartRect[units.rectStart];\n    this.gridOffset = chartRect[units.rectOffset];\n    this.ticks = ticks;\n    this.options = options;\n  }\n\n  function createGridAndLabels(gridGroup, labelGroup, useForeignObject, chartOptions, eventEmitter) {\n    var axisOptions = chartOptions['axis' + this.units.pos.toUpperCase()];\n    var projectedValues = this.ticks.map(this.projectValue.bind(this));\n    var labelValues = this.ticks.map(axisOptions.labelInterpolationFnc);\n\n    projectedValues.forEach(function(projectedValue, index) {\n      var labelOffset = {\n        x: 0,\n        y: 0\n      };\n\n      // TODO: Find better solution for solving this problem\n      // Calculate how much space we have available for the label\n      var labelLength;\n      if(projectedValues[index + 1]) {\n        // If we still have one label ahead, we can calculate the distance to the next tick / label\n        labelLength = projectedValues[index + 1] - projectedValue;\n      } else {\n        // If we don't have a label ahead and we have only two labels in total, we just take the remaining distance to\n        // on the whole axis length. We limit that to a minimum of 30 pixel, so that labels close to the border will\n        // still be visible inside of the chart padding.\n        labelLength = Math.max(this.axisLength - projectedValue, 30);\n      }\n\n      // Skip grid lines and labels where interpolated label values are falsey (execpt for 0)\n      if(Chartist.isFalseyButZero(labelValues[index]) && labelValues[index] !== '') {\n        return;\n      }\n\n      // Transform to global coordinates using the chartRect\n      // We also need to set the label offset for the createLabel function\n      if(this.units.pos === 'x') {\n        projectedValue = this.chartRect.x1 + projectedValue;\n        labelOffset.x = chartOptions.axisX.labelOffset.x;\n\n        // If the labels should be positioned in start position (top side for vertical axis) we need to set a\n        // different offset as for positioned with end (bottom)\n        if(chartOptions.axisX.position === 'start') {\n          labelOffset.y = this.chartRect.padding.top + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20);\n        } else {\n          labelOffset.y = this.chartRect.y1 + chartOptions.axisX.labelOffset.y + (useForeignObject ? 5 : 20);\n        }\n      } else {\n        projectedValue = this.chartRect.y1 - projectedValue;\n        labelOffset.y = chartOptions.axisY.labelOffset.y - (useForeignObject ? labelLength : 0);\n\n        // If the labels should be positioned in start position (left side for horizontal axis) we need to set a\n        // different offset as for positioned with end (right side)\n        if(chartOptions.axisY.position === 'start') {\n          labelOffset.x = useForeignObject ? this.chartRect.padding.left + chartOptions.axisY.labelOffset.x : this.chartRect.x1 - 10;\n        } else {\n          labelOffset.x = this.chartRect.x2 + chartOptions.axisY.labelOffset.x + 10;\n        }\n      }\n\n      if(axisOptions.showGrid) {\n        Chartist.createGrid(projectedValue, index, this, this.gridOffset, this.chartRect[this.counterUnits.len](), gridGroup, [\n          chartOptions.classNames.grid,\n          chartOptions.classNames[this.units.dir]\n        ], eventEmitter);\n      }\n\n      if(axisOptions.showLabel) {\n        Chartist.createLabel(projectedValue, labelLength, index, labelValues, this, axisOptions.offset, labelOffset, labelGroup, [\n          chartOptions.classNames.label,\n          chartOptions.classNames[this.units.dir],\n          (axisOptions.position === 'start' ? chartOptions.classNames[axisOptions.position] : chartOptions.classNames['end'])\n        ], useForeignObject, eventEmitter);\n      }\n    }.bind(this));\n  }\n\n  Chartist.Axis = Chartist.Class.extend({\n    constructor: Axis,\n    createGridAndLabels: createGridAndLabels,\n    projectValue: function(value, index, data) {\n      throw new Error('Base axis can\\'t be instantiated!');\n    }\n  });\n\n  Chartist.Axis.units = axisUnits;\n\n}(this || global, Chartist));\n;/**\n * The auto scale axis uses standard linear scale projection of values along an axis. It uses order of magnitude to find a scale automatically and evaluates the available space in order to find the perfect amount of ticks for your chart.\n * **Options**\n * The following options are used by this axis in addition to the default axis options outlined in the axis configuration of the chart default settings.\n * ```javascript\n * var options = {\n *   // If high is specified then the axis will display values explicitly up to this value and the computed maximum from the data is ignored\n *   high: 100,\n *   // If low is specified then the axis will display values explicitly down to this value and the computed minimum from the data is ignored\n *   low: 0,\n *   // This option will be used when finding the right scale division settings. The amount of ticks on the scale will be determined so that as many ticks as possible will be displayed, while not violating this minimum required space (in pixel).\n *   scaleMinSpace: 20,\n *   // Can be set to true or false. If set to true, the scale will be generated with whole numbers only.\n *   onlyInteger: true,\n *   // The reference value can be used to make sure that this value will always be on the chart. This is especially useful on bipolar charts where the bipolar center always needs to be part of the chart.\n *   referenceValue: 5\n * };\n * ```\n *\n * @module Chartist.AutoScaleAxis\n */\n/* global Chartist */\n(function (globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  function AutoScaleAxis(axisUnit, data, chartRect, options) {\n    // Usually we calculate highLow based on the data but this can be overriden by a highLow object in the options\n    var highLow = options.highLow || Chartist.getHighLow(data, options, axisUnit.pos);\n    this.bounds = Chartist.getBounds(chartRect[axisUnit.rectEnd] - chartRect[axisUnit.rectStart], highLow, options.scaleMinSpace || 20, options.onlyInteger);\n    this.range = {\n      min: this.bounds.min,\n      max: this.bounds.max\n    };\n\n    Chartist.AutoScaleAxis.super.constructor.call(this,\n      axisUnit,\n      chartRect,\n      this.bounds.values,\n      options);\n  }\n\n  function projectValue(value) {\n    return this.axisLength * (+Chartist.getMultiValue(value, this.units.pos) - this.bounds.min) / this.bounds.range;\n  }\n\n  Chartist.AutoScaleAxis = Chartist.Axis.extend({\n    constructor: AutoScaleAxis,\n    projectValue: projectValue\n  });\n\n}(this || global, Chartist));\n;/**\n * The fixed scale axis uses standard linear projection of values along an axis. It makes use of a divisor option to divide the range provided from the minimum and maximum value or the options high and low that will override the computed minimum and maximum.\n * **Options**\n * The following options are used by this axis in addition to the default axis options outlined in the axis configuration of the chart default settings.\n * ```javascript\n * var options = {\n *   // If high is specified then the axis will display values explicitly up to this value and the computed maximum from the data is ignored\n *   high: 100,\n *   // If low is specified then the axis will display values explicitly down to this value and the computed minimum from the data is ignored\n *   low: 0,\n *   // If specified then the value range determined from minimum to maximum (or low and high) will be divided by this number and ticks will be generated at those division points. The default divisor is 1.\n *   divisor: 4,\n *   // If ticks is explicitly set, then the axis will not compute the ticks with the divisor, but directly use the data in ticks to determine at what points on the axis a tick need to be generated.\n *   ticks: [1, 10, 20, 30]\n * };\n * ```\n *\n * @module Chartist.FixedScaleAxis\n */\n/* global Chartist */\n(function (globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  function FixedScaleAxis(axisUnit, data, chartRect, options) {\n    var highLow = options.highLow || Chartist.getHighLow(data, options, axisUnit.pos);\n    this.divisor = options.divisor || 1;\n    this.ticks = options.ticks || Chartist.times(this.divisor).map(function(value, index) {\n      return highLow.low + (highLow.high - highLow.low) / this.divisor * index;\n    }.bind(this));\n    this.ticks.sort(function(a, b) {\n      return a - b;\n    });\n    this.range = {\n      min: highLow.low,\n      max: highLow.high\n    };\n\n    Chartist.FixedScaleAxis.super.constructor.call(this,\n      axisUnit,\n      chartRect,\n      this.ticks,\n      options);\n\n    this.stepLength = this.axisLength / this.divisor;\n  }\n\n  function projectValue(value) {\n    return this.axisLength * (+Chartist.getMultiValue(value, this.units.pos) - this.range.min) / (this.range.max - this.range.min);\n  }\n\n  Chartist.FixedScaleAxis = Chartist.Axis.extend({\n    constructor: FixedScaleAxis,\n    projectValue: projectValue\n  });\n\n}(this || global, Chartist));\n;/**\n * The step axis for step based charts like bar chart or step based line charts. It uses a fixed amount of ticks that will be equally distributed across the whole axis length. The projection is done using the index of the data value rather than the value itself and therefore it's only useful for distribution purpose.\n * **Options**\n * The following options are used by this axis in addition to the default axis options outlined in the axis configuration of the chart default settings.\n * ```javascript\n * var options = {\n *   // Ticks to be used to distribute across the axis length. As this axis type relies on the index of the value rather than the value, arbitrary data that can be converted to a string can be used as ticks.\n *   ticks: ['One', 'Two', 'Three'],\n *   // If set to true the full width will be used to distribute the values where the last value will be at the maximum of the axis length. If false the spaces between the ticks will be evenly distributed instead.\n *   stretch: true\n * };\n * ```\n *\n * @module Chartist.StepAxis\n */\n/* global Chartist */\n(function (globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  function StepAxis(axisUnit, data, chartRect, options) {\n    Chartist.StepAxis.super.constructor.call(this,\n      axisUnit,\n      chartRect,\n      options.ticks,\n      options);\n\n    var calc = Math.max(1, options.ticks.length - (options.stretch ? 1 : 0));\n    this.stepLength = this.axisLength / calc;\n  }\n\n  function projectValue(value, index) {\n    return this.stepLength * index;\n  }\n\n  Chartist.StepAxis = Chartist.Axis.extend({\n    constructor: StepAxis,\n    projectValue: projectValue\n  });\n\n}(this || global, Chartist));\n;/**\n * The Chartist line chart can be used to draw Line or Scatter charts. If used in the browser you can access the global `Chartist` namespace where you find the `Line` function as a main entry point.\n *\n * For examples on how to use the line chart please check the examples of the `Chartist.Line` method.\n *\n * @module Chartist.Line\n */\n/* global Chartist */\n(function(globalRoot, Chartist){\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  /**\n   * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n   *\n   * @memberof Chartist.Line\n   */\n  var defaultOptions = {\n    // Options for X-Axis\n    axisX: {\n      // The offset of the labels to the chart area\n      offset: 30,\n      // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n      position: 'end',\n      // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n      labelOffset: {\n        x: 0,\n        y: 0\n      },\n      // If labels should be shown or not\n      showLabel: true,\n      // If the axis grid should be drawn or not\n      showGrid: true,\n      // Interpolation function that allows you to intercept the value from the axis label\n      labelInterpolationFnc: Chartist.noop,\n      // Set the axis type to be used to project values on this axis. If not defined, Chartist.StepAxis will be used for the X-Axis, where the ticks option will be set to the labels in the data and the stretch option will be set to the global fullWidth option. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n      type: undefined\n    },\n    // Options for Y-Axis\n    axisY: {\n      // The offset of the labels to the chart area\n      offset: 40,\n      // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n      position: 'start',\n      // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n      labelOffset: {\n        x: 0,\n        y: 0\n      },\n      // If labels should be shown or not\n      showLabel: true,\n      // If the axis grid should be drawn or not\n      showGrid: true,\n      // Interpolation function that allows you to intercept the value from the axis label\n      labelInterpolationFnc: Chartist.noop,\n      // Set the axis type to be used to project values on this axis. If not defined, Chartist.AutoScaleAxis will be used for the Y-Axis, where the high and low options will be set to the global high and low options. This type can be changed to any axis constructor available (e.g. Chartist.FixedScaleAxis), where all axis options should be present here.\n      type: undefined,\n      // This value specifies the minimum height in pixel of the scale steps\n      scaleMinSpace: 20,\n      // Use only integer values (whole numbers) for the scale steps\n      onlyInteger: false\n    },\n    // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n    width: undefined,\n    // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n    height: undefined,\n    // If the line should be drawn or not\n    showLine: true,\n    // If dots should be drawn or not\n    showPoint: true,\n    // If the line chart should draw an area\n    showArea: false,\n    // The base for the area chart that will be used to close the area shape (is normally 0)\n    areaBase: 0,\n    // Specify if the lines should be smoothed. This value can be true or false where true will result in smoothing using the default smoothing interpolation function Chartist.Interpolation.cardinal and false results in Chartist.Interpolation.none. You can also choose other smoothing / interpolation functions available in the Chartist.Interpolation module, or write your own interpolation function. Check the examples for a brief description.\n    lineSmooth: true,\n    // If the line chart should add a background fill to the .ct-grids group.\n    showGridBackground: false,\n    // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n    low: undefined,\n    // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n    high: undefined,\n    // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n    chartPadding: {\n      top: 15,\n      right: 15,\n      bottom: 5,\n      left: 10\n    },\n    // When set to true, the last grid line on the x-axis is not drawn and the chart elements will expand to the full available width of the chart. For the last label to be drawn correctly you might need to add chart padding or offset the last label with a draw event handler.\n    fullWidth: false,\n    // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n    reverseData: false,\n    // Override the class names that get used to generate the SVG structure of the chart\n    classNames: {\n      chart: 'ct-chart-line',\n      label: 'ct-label',\n      labelGroup: 'ct-labels',\n      series: 'ct-series',\n      line: 'ct-line',\n      point: 'ct-point',\n      area: 'ct-area',\n      grid: 'ct-grid',\n      gridGroup: 'ct-grids',\n      gridBackground: 'ct-grid-background',\n      vertical: 'ct-vertical',\n      horizontal: 'ct-horizontal',\n      start: 'ct-start',\n      end: 'ct-end'\n    }\n  };\n\n  /**\n   * Creates a new chart\n   *\n   */\n  function createChart(options) {\n    var data = Chartist.normalizeData(this.data, options.reverseData, true);\n\n    // Create new svg object\n    this.svg = Chartist.createSvg(this.container, options.width, options.height, options.classNames.chart);\n    // Create groups for labels, grid and series\n    var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n    var seriesGroup = this.svg.elem('g');\n    var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n    var chartRect = Chartist.createChartRect(this.svg, options, defaultOptions.padding);\n    var axisX, axisY;\n\n    if(options.axisX.type === undefined) {\n      axisX = new Chartist.StepAxis(Chartist.Axis.units.x, data.normalized.series, chartRect, Chartist.extend({}, options.axisX, {\n        ticks: data.normalized.labels,\n        stretch: options.fullWidth\n      }));\n    } else {\n      axisX = options.axisX.type.call(Chartist, Chartist.Axis.units.x, data.normalized.series, chartRect, options.axisX);\n    }\n\n    if(options.axisY.type === undefined) {\n      axisY = new Chartist.AutoScaleAxis(Chartist.Axis.units.y, data.normalized.series, chartRect, Chartist.extend({}, options.axisY, {\n        high: Chartist.isNumeric(options.high) ? options.high : options.axisY.high,\n        low: Chartist.isNumeric(options.low) ? options.low : options.axisY.low\n      }));\n    } else {\n      axisY = options.axisY.type.call(Chartist, Chartist.Axis.units.y, data.normalized.series, chartRect, options.axisY);\n    }\n\n    axisX.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n    axisY.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n    if (options.showGridBackground) {\n      Chartist.createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n    }\n\n    // Draw the series\n    data.raw.series.forEach(function(series, seriesIndex) {\n      var seriesElement = seriesGroup.elem('g');\n\n      // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n      seriesElement.attr({\n        'ct:series-name': series.name,\n        'ct:meta': Chartist.serialize(series.meta)\n      });\n\n      // Use series class from series data or if not set generate one\n      seriesElement.addClass([\n        options.classNames.series,\n        (series.className || options.classNames.series + '-' + Chartist.alphaNumerate(seriesIndex))\n      ].join(' '));\n\n      var pathCoordinates = [],\n        pathData = [];\n\n      data.normalized.series[seriesIndex].forEach(function(value, valueIndex) {\n        var p = {\n          x: chartRect.x1 + axisX.projectValue(value, valueIndex, data.normalized.series[seriesIndex]),\n          y: chartRect.y1 - axisY.projectValue(value, valueIndex, data.normalized.series[seriesIndex])\n        };\n        pathCoordinates.push(p.x, p.y);\n        pathData.push({\n          value: value,\n          valueIndex: valueIndex,\n          meta: Chartist.getMetaData(series, valueIndex)\n        });\n      }.bind(this));\n\n      var seriesOptions = {\n        lineSmooth: Chartist.getSeriesOption(series, options, 'lineSmooth'),\n        showPoint: Chartist.getSeriesOption(series, options, 'showPoint'),\n        showLine: Chartist.getSeriesOption(series, options, 'showLine'),\n        showArea: Chartist.getSeriesOption(series, options, 'showArea'),\n        areaBase: Chartist.getSeriesOption(series, options, 'areaBase')\n      };\n\n      var smoothing = typeof seriesOptions.lineSmooth === 'function' ?\n        seriesOptions.lineSmooth : (seriesOptions.lineSmooth ? Chartist.Interpolation.monotoneCubic() : Chartist.Interpolation.none());\n      // Interpolating path where pathData will be used to annotate each path element so we can trace back the original\n      // index, value and meta data\n      var path = smoothing(pathCoordinates, pathData);\n\n      // If we should show points we need to create them now to avoid secondary loop\n      // Points are drawn from the pathElements returned by the interpolation function\n      // Small offset for Firefox to render squares correctly\n      if (seriesOptions.showPoint) {\n\n        path.pathElements.forEach(function(pathElement) {\n          var point = seriesElement.elem('line', {\n            x1: pathElement.x,\n            y1: pathElement.y,\n            x2: pathElement.x + 0.01,\n            y2: pathElement.y\n          }, options.classNames.point).attr({\n            'ct:value': [pathElement.data.value.x, pathElement.data.value.y].filter(Chartist.isNumeric).join(','),\n            'ct:meta': Chartist.serialize(pathElement.data.meta)\n          });\n\n          this.eventEmitter.emit('draw', {\n            type: 'point',\n            value: pathElement.data.value,\n            index: pathElement.data.valueIndex,\n            meta: pathElement.data.meta,\n            series: series,\n            seriesIndex: seriesIndex,\n            axisX: axisX,\n            axisY: axisY,\n            group: seriesElement,\n            element: point,\n            x: pathElement.x,\n            y: pathElement.y\n          });\n        }.bind(this));\n      }\n\n      if(seriesOptions.showLine) {\n        var line = seriesElement.elem('path', {\n          d: path.stringify()\n        }, options.classNames.line, true);\n\n        this.eventEmitter.emit('draw', {\n          type: 'line',\n          values: data.normalized.series[seriesIndex],\n          path: path.clone(),\n          chartRect: chartRect,\n          index: seriesIndex,\n          series: series,\n          seriesIndex: seriesIndex,\n          seriesMeta: series.meta,\n          axisX: axisX,\n          axisY: axisY,\n          group: seriesElement,\n          element: line\n        });\n      }\n\n      // Area currently only works with axes that support a range!\n      if(seriesOptions.showArea && axisY.range) {\n        // If areaBase is outside the chart area (< min or > max) we need to set it respectively so that\n        // the area is not drawn outside the chart area.\n        var areaBase = Math.max(Math.min(seriesOptions.areaBase, axisY.range.max), axisY.range.min);\n\n        // We project the areaBase value into screen coordinates\n        var areaBaseProjected = chartRect.y1 - axisY.projectValue(areaBase);\n\n        // In order to form the area we'll first split the path by move commands so we can chunk it up into segments\n        path.splitByCommand('M').filter(function onlySolidSegments(pathSegment) {\n          // We filter only \"solid\" segments that contain more than one point. Otherwise there's no need for an area\n          return pathSegment.pathElements.length > 1;\n        }).map(function convertToArea(solidPathSegments) {\n          // Receiving the filtered solid path segments we can now convert those segments into fill areas\n          var firstElement = solidPathSegments.pathElements[0];\n          var lastElement = solidPathSegments.pathElements[solidPathSegments.pathElements.length - 1];\n\n          // Cloning the solid path segment with closing option and removing the first move command from the clone\n          // We then insert a new move that should start at the area base and draw a straight line up or down\n          // at the end of the path we add an additional straight line to the projected area base value\n          // As the closing option is set our path will be automatically closed\n          return solidPathSegments.clone(true)\n            .position(0)\n            .remove(1)\n            .move(firstElement.x, areaBaseProjected)\n            .line(firstElement.x, firstElement.y)\n            .position(solidPathSegments.pathElements.length + 1)\n            .line(lastElement.x, areaBaseProjected);\n\n        }).forEach(function createArea(areaPath) {\n          // For each of our newly created area paths, we'll now create path elements by stringifying our path objects\n          // and adding the created DOM elements to the correct series group\n          var area = seriesElement.elem('path', {\n            d: areaPath.stringify()\n          }, options.classNames.area, true);\n\n          // Emit an event for each area that was drawn\n          this.eventEmitter.emit('draw', {\n            type: 'area',\n            values: data.normalized.series[seriesIndex],\n            path: areaPath.clone(),\n            series: series,\n            seriesIndex: seriesIndex,\n            axisX: axisX,\n            axisY: axisY,\n            chartRect: chartRect,\n            index: seriesIndex,\n            group: seriesElement,\n            element: area\n          });\n        }.bind(this));\n      }\n    }.bind(this));\n\n    this.eventEmitter.emit('created', {\n      bounds: axisY.bounds,\n      chartRect: chartRect,\n      axisX: axisX,\n      axisY: axisY,\n      svg: this.svg,\n      options: options\n    });\n  }\n\n  /**\n   * This method creates a new line chart.\n   *\n   * @memberof Chartist.Line\n   * @param {String|Node} query A selector query string or directly a DOM element\n   * @param {Object} data The data object that needs to consist of a labels and a series array\n   * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n   * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n   * @return {Object} An object which exposes the API for the created chart\n   *\n   * @example\n   * // Create a simple line chart\n   * var data = {\n   *   // A labels array that can contain any sort of values\n   *   labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n   *   // Our series array that contains series objects or in this case series data arrays\n   *   series: [\n   *     [5, 2, 4, 2, 0]\n   *   ]\n   * };\n   *\n   * // As options we currently only set a static size of 300x200 px\n   * var options = {\n   *   width: '300px',\n   *   height: '200px'\n   * };\n   *\n   * // In the global name space Chartist we call the Line function to initialize a line chart. As a first parameter we pass in a selector where we would like to get our chart created. Second parameter is the actual data object and as a third parameter we pass in our options\n   * new Chartist.Line('.ct-chart', data, options);\n   *\n   * @example\n   * // Use specific interpolation function with configuration from the Chartist.Interpolation module\n   *\n   * var chart = new Chartist.Line('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5],\n   *   series: [\n   *     [1, 1, 8, 1, 7]\n   *   ]\n   * }, {\n   *   lineSmooth: Chartist.Interpolation.cardinal({\n   *     tension: 0.2\n   *   })\n   * });\n   *\n   * @example\n   * // Create a line chart with responsive options\n   *\n   * var data = {\n   *   // A labels array that can contain any sort of values\n   *   labels: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],\n   *   // Our series array that contains series objects or in this case series data arrays\n   *   series: [\n   *     [5, 2, 4, 2, 0]\n   *   ]\n   * };\n   *\n   * // In addition to the regular options we specify responsive option overrides that will override the default configutation based on the matching media queries.\n   * var responsiveOptions = [\n   *   ['screen and (min-width: 641px) and (max-width: 1024px)', {\n   *     showPoint: false,\n   *     axisX: {\n   *       labelInterpolationFnc: function(value) {\n   *         // Will return Mon, Tue, Wed etc. on medium screens\n   *         return value.slice(0, 3);\n   *       }\n   *     }\n   *   }],\n   *   ['screen and (max-width: 640px)', {\n   *     showLine: false,\n   *     axisX: {\n   *       labelInterpolationFnc: function(value) {\n   *         // Will return M, T, W etc. on small screens\n   *         return value[0];\n   *       }\n   *     }\n   *   }]\n   * ];\n   *\n   * new Chartist.Line('.ct-chart', data, null, responsiveOptions);\n   *\n   */\n  function Line(query, data, options, responsiveOptions) {\n    Chartist.Line.super.constructor.call(this,\n      query,\n      data,\n      defaultOptions,\n      Chartist.extend({}, defaultOptions, options),\n      responsiveOptions);\n  }\n\n  // Creating line chart type in Chartist namespace\n  Chartist.Line = Chartist.Base.extend({\n    constructor: Line,\n    createChart: createChart\n  });\n\n}(this || global, Chartist));\n;/**\n * The bar chart module of Chartist that can be used to draw unipolar or bipolar bar and grouped bar charts.\n *\n * @module Chartist.Bar\n */\n/* global Chartist */\n(function(globalRoot, Chartist){\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  /**\n   * Default options in bar charts. Expand the code view to see a detailed list of options with comments.\n   *\n   * @memberof Chartist.Bar\n   */\n  var defaultOptions = {\n    // Options for X-Axis\n    axisX: {\n      // The offset of the chart drawing area to the border of the container\n      offset: 30,\n      // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n      position: 'end',\n      // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n      labelOffset: {\n        x: 0,\n        y: 0\n      },\n      // If labels should be shown or not\n      showLabel: true,\n      // If the axis grid should be drawn or not\n      showGrid: true,\n      // Interpolation function that allows you to intercept the value from the axis label\n      labelInterpolationFnc: Chartist.noop,\n      // This value specifies the minimum width in pixel of the scale steps\n      scaleMinSpace: 30,\n      // Use only integer values (whole numbers) for the scale steps\n      onlyInteger: false\n    },\n    // Options for Y-Axis\n    axisY: {\n      // The offset of the chart drawing area to the border of the container\n      offset: 40,\n      // Position where labels are placed. Can be set to `start` or `end` where `start` is equivalent to left or top on vertical axis and `end` is equivalent to right or bottom on horizontal axis.\n      position: 'start',\n      // Allows you to correct label positioning on this axis by positive or negative x and y offset.\n      labelOffset: {\n        x: 0,\n        y: 0\n      },\n      // If labels should be shown or not\n      showLabel: true,\n      // If the axis grid should be drawn or not\n      showGrid: true,\n      // Interpolation function that allows you to intercept the value from the axis label\n      labelInterpolationFnc: Chartist.noop,\n      // This value specifies the minimum height in pixel of the scale steps\n      scaleMinSpace: 20,\n      // Use only integer values (whole numbers) for the scale steps\n      onlyInteger: false\n    },\n    // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n    width: undefined,\n    // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n    height: undefined,\n    // Overriding the natural high of the chart allows you to zoom in or limit the charts highest displayed value\n    high: undefined,\n    // Overriding the natural low of the chart allows you to zoom in or limit the charts lowest displayed value\n    low: undefined,\n    // Unless low/high are explicitly set, bar chart will be centered at zero by default. Set referenceValue to null to auto scale.\n    referenceValue: 0,\n    // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n    chartPadding: {\n      top: 15,\n      right: 15,\n      bottom: 5,\n      left: 10\n    },\n    // Specify the distance in pixel of bars in a group\n    seriesBarDistance: 15,\n    // If set to true this property will cause the series bars to be stacked. Check the `stackMode` option for further stacking options.\n    stackBars: false,\n    // If set to 'overlap' this property will force the stacked bars to draw from the zero line.\n    // If set to 'accumulate' this property will form a total for each series point. This will also influence the y-axis and the overall bounds of the chart. In stacked mode the seriesBarDistance property will have no effect.\n    stackMode: 'accumulate',\n    // Inverts the axes of the bar chart in order to draw a horizontal bar chart. Be aware that you also need to invert your axis settings as the Y Axis will now display the labels and the X Axis the values.\n    horizontalBars: false,\n    // If set to true then each bar will represent a series and the data array is expected to be a one dimensional array of data values rather than a series array of series. This is useful if the bar chart should represent a profile rather than some data over time.\n    distributeSeries: false,\n    // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n    reverseData: false,\n    // If the bar chart should add a background fill to the .ct-grids group.\n    showGridBackground: false,\n    // Override the class names that get used to generate the SVG structure of the chart\n    classNames: {\n      chart: 'ct-chart-bar',\n      horizontalBars: 'ct-horizontal-bars',\n      label: 'ct-label',\n      labelGroup: 'ct-labels',\n      series: 'ct-series',\n      bar: 'ct-bar',\n      grid: 'ct-grid',\n      gridGroup: 'ct-grids',\n      gridBackground: 'ct-grid-background',\n      vertical: 'ct-vertical',\n      horizontal: 'ct-horizontal',\n      start: 'ct-start',\n      end: 'ct-end'\n    }\n  };\n\n  /**\n   * Creates a new chart\n   *\n   */\n  function createChart(options) {\n    var data;\n    var highLow;\n\n    if(options.distributeSeries) {\n      data = Chartist.normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n      data.normalized.series = data.normalized.series.map(function(value) {\n        return [value];\n      });\n    } else {\n      data = Chartist.normalizeData(this.data, options.reverseData, options.horizontalBars ? 'x' : 'y');\n    }\n\n    // Create new svg element\n    this.svg = Chartist.createSvg(\n      this.container,\n      options.width,\n      options.height,\n      options.classNames.chart + (options.horizontalBars ? ' ' + options.classNames.horizontalBars : '')\n    );\n\n    // Drawing groups in correct order\n    var gridGroup = this.svg.elem('g').addClass(options.classNames.gridGroup);\n    var seriesGroup = this.svg.elem('g');\n    var labelGroup = this.svg.elem('g').addClass(options.classNames.labelGroup);\n\n    if(options.stackBars && data.normalized.series.length !== 0) {\n\n      // If stacked bars we need to calculate the high low from stacked values from each series\n      var serialSums = Chartist.serialMap(data.normalized.series, function serialSums() {\n        return Array.prototype.slice.call(arguments).map(function(value) {\n          return value;\n        }).reduce(function(prev, curr) {\n          return {\n            x: prev.x + (curr && curr.x) || 0,\n            y: prev.y + (curr && curr.y) || 0\n          };\n        }, {x: 0, y: 0});\n      });\n\n      highLow = Chartist.getHighLow([serialSums], options, options.horizontalBars ? 'x' : 'y');\n\n    } else {\n\n      highLow = Chartist.getHighLow(data.normalized.series, options, options.horizontalBars ? 'x' : 'y');\n    }\n\n    // Overrides of high / low from settings\n    highLow.high = +options.high || (options.high === 0 ? 0 : highLow.high);\n    highLow.low = +options.low || (options.low === 0 ? 0 : highLow.low);\n\n    var chartRect = Chartist.createChartRect(this.svg, options, defaultOptions.padding);\n\n    var valueAxis,\n      labelAxisTicks,\n      labelAxis,\n      axisX,\n      axisY;\n\n    // We need to set step count based on some options combinations\n    if(options.distributeSeries && options.stackBars) {\n      // If distributed series are enabled and bars need to be stacked, we'll only have one bar and therefore should\n      // use only the first label for the step axis\n      labelAxisTicks = data.normalized.labels.slice(0, 1);\n    } else {\n      // If distributed series are enabled but stacked bars aren't, we should use the series labels\n      // If we are drawing a regular bar chart with two dimensional series data, we just use the labels array\n      // as the bars are normalized\n      labelAxisTicks = data.normalized.labels;\n    }\n\n    // Set labelAxis and valueAxis based on the horizontalBars setting. This setting will flip the axes if necessary.\n    if(options.horizontalBars) {\n      if(options.axisX.type === undefined) {\n        valueAxis = axisX = new Chartist.AutoScaleAxis(Chartist.Axis.units.x, data.normalized.series, chartRect, Chartist.extend({}, options.axisX, {\n          highLow: highLow,\n          referenceValue: 0\n        }));\n      } else {\n        valueAxis = axisX = options.axisX.type.call(Chartist, Chartist.Axis.units.x, data.normalized.series, chartRect, Chartist.extend({}, options.axisX, {\n          highLow: highLow,\n          referenceValue: 0\n        }));\n      }\n\n      if(options.axisY.type === undefined) {\n        labelAxis = axisY = new Chartist.StepAxis(Chartist.Axis.units.y, data.normalized.series, chartRect, {\n          ticks: labelAxisTicks\n        });\n      } else {\n        labelAxis = axisY = options.axisY.type.call(Chartist, Chartist.Axis.units.y, data.normalized.series, chartRect, options.axisY);\n      }\n    } else {\n      if(options.axisX.type === undefined) {\n        labelAxis = axisX = new Chartist.StepAxis(Chartist.Axis.units.x, data.normalized.series, chartRect, {\n          ticks: labelAxisTicks\n        });\n      } else {\n        labelAxis = axisX = options.axisX.type.call(Chartist, Chartist.Axis.units.x, data.normalized.series, chartRect, options.axisX);\n      }\n\n      if(options.axisY.type === undefined) {\n        valueAxis = axisY = new Chartist.AutoScaleAxis(Chartist.Axis.units.y, data.normalized.series, chartRect, Chartist.extend({}, options.axisY, {\n          highLow: highLow,\n          referenceValue: 0\n        }));\n      } else {\n        valueAxis = axisY = options.axisY.type.call(Chartist, Chartist.Axis.units.y, data.normalized.series, chartRect, Chartist.extend({}, options.axisY, {\n          highLow: highLow,\n          referenceValue: 0\n        }));\n      }\n    }\n\n    // Projected 0 point\n    var zeroPoint = options.horizontalBars ? (chartRect.x1 + valueAxis.projectValue(0)) : (chartRect.y1 - valueAxis.projectValue(0));\n    // Used to track the screen coordinates of stacked bars\n    var stackedBarValues = [];\n\n    labelAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n    valueAxis.createGridAndLabels(gridGroup, labelGroup, this.supportsForeignObject, options, this.eventEmitter);\n\n    if (options.showGridBackground) {\n      Chartist.createGridBackground(gridGroup, chartRect, options.classNames.gridBackground, this.eventEmitter);\n    }\n\n    // Draw the series\n    data.raw.series.forEach(function(series, seriesIndex) {\n      // Calculating bi-polar value of index for seriesOffset. For i = 0..4 biPol will be -1.5, -0.5, 0.5, 1.5 etc.\n      var biPol = seriesIndex - (data.raw.series.length - 1) / 2;\n      // Half of the period width between vertical grid lines used to position bars\n      var periodHalfLength;\n      // Current series SVG element\n      var seriesElement;\n\n      // We need to set periodHalfLength based on some options combinations\n      if(options.distributeSeries && !options.stackBars) {\n        // If distributed series are enabled but stacked bars aren't, we need to use the length of the normaizedData array\n        // which is the series count and divide by 2\n        periodHalfLength = labelAxis.axisLength / data.normalized.series.length / 2;\n      } else if(options.distributeSeries && options.stackBars) {\n        // If distributed series and stacked bars are enabled we'll only get one bar so we should just divide the axis\n        // length by 2\n        periodHalfLength = labelAxis.axisLength / 2;\n      } else {\n        // On regular bar charts we should just use the series length\n        periodHalfLength = labelAxis.axisLength / data.normalized.series[seriesIndex].length / 2;\n      }\n\n      // Adding the series group to the series element\n      seriesElement = seriesGroup.elem('g');\n\n      // Write attributes to series group element. If series name or meta is undefined the attributes will not be written\n      seriesElement.attr({\n        'ct:series-name': series.name,\n        'ct:meta': Chartist.serialize(series.meta)\n      });\n\n      // Use series class from series data or if not set generate one\n      seriesElement.addClass([\n        options.classNames.series,\n        (series.className || options.classNames.series + '-' + Chartist.alphaNumerate(seriesIndex))\n      ].join(' '));\n\n      data.normalized.series[seriesIndex].forEach(function(value, valueIndex) {\n        var projected,\n          bar,\n          previousStack,\n          labelAxisValueIndex;\n\n        // We need to set labelAxisValueIndex based on some options combinations\n        if(options.distributeSeries && !options.stackBars) {\n          // If distributed series are enabled but stacked bars aren't, we can use the seriesIndex for later projection\n          // on the step axis for label positioning\n          labelAxisValueIndex = seriesIndex;\n        } else if(options.distributeSeries && options.stackBars) {\n          // If distributed series and stacked bars are enabled, we will only get one bar and therefore always use\n          // 0 for projection on the label step axis\n          labelAxisValueIndex = 0;\n        } else {\n          // On regular bar charts we just use the value index to project on the label step axis\n          labelAxisValueIndex = valueIndex;\n        }\n\n        // We need to transform coordinates differently based on the chart layout\n        if(options.horizontalBars) {\n          projected = {\n            x: chartRect.x1 + valueAxis.projectValue(value && value.x ? value.x : 0, valueIndex, data.normalized.series[seriesIndex]),\n            y: chartRect.y1 - labelAxis.projectValue(value && value.y ? value.y : 0, labelAxisValueIndex, data.normalized.series[seriesIndex])\n          };\n        } else {\n          projected = {\n            x: chartRect.x1 + labelAxis.projectValue(value && value.x ? value.x : 0, labelAxisValueIndex, data.normalized.series[seriesIndex]),\n            y: chartRect.y1 - valueAxis.projectValue(value && value.y ? value.y : 0, valueIndex, data.normalized.series[seriesIndex])\n          }\n        }\n\n        // If the label axis is a step based axis we will offset the bar into the middle of between two steps using\n        // the periodHalfLength value. Also we do arrange the different series so that they align up to each other using\n        // the seriesBarDistance. If we don't have a step axis, the bar positions can be chosen freely so we should not\n        // add any automated positioning.\n        if(labelAxis instanceof Chartist.StepAxis) {\n          // Offset to center bar between grid lines, but only if the step axis is not stretched\n          if(!labelAxis.options.stretch) {\n            projected[labelAxis.units.pos] += periodHalfLength * (options.horizontalBars ? -1 : 1);\n          }\n          // Using bi-polar offset for multiple series if no stacked bars or series distribution is used\n          projected[labelAxis.units.pos] += (options.stackBars || options.distributeSeries) ? 0 : biPol * options.seriesBarDistance * (options.horizontalBars ? -1 : 1);\n        }\n\n        // Enter value in stacked bar values used to remember previous screen value for stacking up bars\n        previousStack = stackedBarValues[valueIndex] || zeroPoint;\n        stackedBarValues[valueIndex] = previousStack - (zeroPoint - projected[labelAxis.counterUnits.pos]);\n\n        // Skip if value is undefined\n        if(value === undefined) {\n          return;\n        }\n\n        var positions = {};\n        positions[labelAxis.units.pos + '1'] = projected[labelAxis.units.pos];\n        positions[labelAxis.units.pos + '2'] = projected[labelAxis.units.pos];\n\n        if(options.stackBars && (options.stackMode === 'accumulate' || !options.stackMode)) {\n          // Stack mode: accumulate (default)\n          // If bars are stacked we use the stackedBarValues reference and otherwise base all bars off the zero line\n          // We want backwards compatibility, so the expected fallback without the 'stackMode' option\n          // to be the original behaviour (accumulate)\n          positions[labelAxis.counterUnits.pos + '1'] = previousStack;\n          positions[labelAxis.counterUnits.pos + '2'] = stackedBarValues[valueIndex];\n        } else {\n          // Draw from the zero line normally\n          // This is also the same code for Stack mode: overlap\n          positions[labelAxis.counterUnits.pos + '1'] = zeroPoint;\n          positions[labelAxis.counterUnits.pos + '2'] = projected[labelAxis.counterUnits.pos];\n        }\n\n        // Limit x and y so that they are within the chart rect\n        positions.x1 = Math.min(Math.max(positions.x1, chartRect.x1), chartRect.x2);\n        positions.x2 = Math.min(Math.max(positions.x2, chartRect.x1), chartRect.x2);\n        positions.y1 = Math.min(Math.max(positions.y1, chartRect.y2), chartRect.y1);\n        positions.y2 = Math.min(Math.max(positions.y2, chartRect.y2), chartRect.y1);\n\n        var metaData = Chartist.getMetaData(series, valueIndex);\n\n        // Create bar element\n        bar = seriesElement.elem('line', positions, options.classNames.bar).attr({\n          'ct:value': [value.x, value.y].filter(Chartist.isNumeric).join(','),\n          'ct:meta': Chartist.serialize(metaData)\n        });\n\n        this.eventEmitter.emit('draw', Chartist.extend({\n          type: 'bar',\n          value: value,\n          index: valueIndex,\n          meta: metaData,\n          series: series,\n          seriesIndex: seriesIndex,\n          axisX: axisX,\n          axisY: axisY,\n          chartRect: chartRect,\n          group: seriesElement,\n          element: bar\n        }, positions));\n      }.bind(this));\n    }.bind(this));\n\n    this.eventEmitter.emit('created', {\n      bounds: valueAxis.bounds,\n      chartRect: chartRect,\n      axisX: axisX,\n      axisY: axisY,\n      svg: this.svg,\n      options: options\n    });\n  }\n\n  /**\n   * This method creates a new bar chart and returns API object that you can use for later changes.\n   *\n   * @memberof Chartist.Bar\n   * @param {String|Node} query A selector query string or directly a DOM element\n   * @param {Object} data The data object that needs to consist of a labels and a series array\n   * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n   * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n   * @return {Object} An object which exposes the API for the created chart\n   *\n   * @example\n   * // Create a simple bar chart\n   * var data = {\n   *   labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n   *   series: [\n   *     [5, 2, 4, 2, 0]\n   *   ]\n   * };\n   *\n   * // In the global name space Chartist we call the Bar function to initialize a bar chart. As a first parameter we pass in a selector where we would like to get our chart created and as a second parameter we pass our data object.\n   * new Chartist.Bar('.ct-chart', data);\n   *\n   * @example\n   * // This example creates a bipolar grouped bar chart where the boundaries are limitted to -10 and 10\n   * new Chartist.Bar('.ct-chart', {\n   *   labels: [1, 2, 3, 4, 5, 6, 7],\n   *   series: [\n   *     [1, 3, 2, -5, -3, 1, -6],\n   *     [-5, -2, -4, -1, 2, -3, 1]\n   *   ]\n   * }, {\n   *   seriesBarDistance: 12,\n   *   low: -10,\n   *   high: 10\n   * });\n   *\n   */\n  function Bar(query, data, options, responsiveOptions) {\n    Chartist.Bar.super.constructor.call(this,\n      query,\n      data,\n      defaultOptions,\n      Chartist.extend({}, defaultOptions, options),\n      responsiveOptions);\n  }\n\n  // Creating bar chart type in Chartist namespace\n  Chartist.Bar = Chartist.Base.extend({\n    constructor: Bar,\n    createChart: createChart\n  });\n\n}(this || global, Chartist));\n;/**\n * The pie chart module of Chartist that can be used to draw pie, donut or gauge charts\n *\n * @module Chartist.Pie\n */\n/* global Chartist */\n(function(globalRoot, Chartist) {\n  'use strict';\n\n  var window = globalRoot.window;\n  var document = globalRoot.document;\n\n  /**\n   * Default options in line charts. Expand the code view to see a detailed list of options with comments.\n   *\n   * @memberof Chartist.Pie\n   */\n  var defaultOptions = {\n    // Specify a fixed width for the chart as a string (i.e. '100px' or '50%')\n    width: undefined,\n    // Specify a fixed height for the chart as a string (i.e. '100px' or '50%')\n    height: undefined,\n    // Padding of the chart drawing area to the container element and labels as a number or padding object {top: 5, right: 5, bottom: 5, left: 5}\n    chartPadding: 5,\n    // Override the class names that are used to generate the SVG structure of the chart\n    classNames: {\n      chartPie: 'ct-chart-pie',\n      chartDonut: 'ct-chart-donut',\n      series: 'ct-series',\n      slicePie: 'ct-slice-pie',\n      sliceDonut: 'ct-slice-donut',\n      sliceDonutSolid: 'ct-slice-donut-solid',\n      label: 'ct-label'\n    },\n    // The start angle of the pie chart in degrees where 0 points north. A higher value offsets the start angle clockwise.\n    startAngle: 0,\n    // An optional total you can specify. By specifying a total value, the sum of the values in the series must be this total in order to draw a full pie. You can use this parameter to draw only parts of a pie or gauge charts.\n    total: undefined,\n    // If specified the donut CSS classes will be used and strokes will be drawn instead of pie slices.\n    donut: false,\n    // If specified the donut segments will be drawn as shapes instead of strokes.\n    donutSolid: false,\n    // Specify the donut stroke width, currently done in javascript for convenience. May move to CSS styles in the future.\n    // This option can be set as number or string to specify a relative width (i.e. 100 or '30%').\n    donutWidth: 60,\n    // If a label should be shown or not\n    showLabel: true,\n    // Label position offset from the standard position which is half distance of the radius. This value can be either positive or negative. Positive values will position the label away from the center.\n    labelOffset: 0,\n    // This option can be set to 'inside', 'outside' or 'center'. Positioned with 'inside' the labels will be placed on half the distance of the radius to the border of the Pie by respecting the 'labelOffset'. The 'outside' option will place the labels at the border of the pie and 'center' will place the labels in the absolute center point of the chart. The 'center' option only makes sense in conjunction with the 'labelOffset' option.\n    labelPosition: 'inside',\n    // An interpolation function for the label value\n    labelInterpolationFnc: Chartist.noop,\n    // Label direction can be 'neutral', 'explode' or 'implode'. The labels anchor will be positioned based on those settings as well as the fact if the labels are on the right or left side of the center of the chart. Usually explode is useful when labels are positioned far away from the center.\n    labelDirection: 'neutral',\n    // If true the whole data is reversed including labels, the series order as well as the whole series data arrays.\n    reverseData: false,\n    // If true empty values will be ignored to avoid drawing unncessary slices and labels\n    ignoreEmptyValues: false\n  };\n\n  /**\n   * Determines SVG anchor position based on direction and center parameter\n   *\n   * @param center\n   * @param label\n   * @param direction\n   * @return {string}\n   */\n  function determineAnchorPosition(center, label, direction) {\n    var toTheRight = label.x > center.x;\n\n    if(toTheRight && direction === 'explode' ||\n      !toTheRight && direction === 'implode') {\n      return 'start';\n    } else if(toTheRight && direction === 'implode' ||\n      !toTheRight && direction === 'explode') {\n      return 'end';\n    } else {\n      return 'middle';\n    }\n  }\n\n  /**\n   * Creates the pie chart\n   *\n   * @param options\n   */\n  function createChart(options) {\n    var data = Chartist.normalizeData(this.data);\n    var seriesGroups = [],\n      labelsGroup,\n      chartRect,\n      radius,\n      labelRadius,\n      totalDataSum,\n      startAngle = options.startAngle;\n\n    // Create SVG.js draw\n    this.svg = Chartist.createSvg(this.container, options.width, options.height,options.donut ? options.classNames.chartDonut : options.classNames.chartPie);\n    // Calculate charting rect\n    chartRect = Chartist.createChartRect(this.svg, options, defaultOptions.padding);\n    // Get biggest circle radius possible within chartRect\n    radius = Math.min(chartRect.width() / 2, chartRect.height() / 2);\n    // Calculate total of all series to get reference value or use total reference from optional options\n    totalDataSum = options.total || data.normalized.series.reduce(function(previousValue, currentValue) {\n      return previousValue + currentValue;\n    }, 0);\n\n    var donutWidth = Chartist.quantity(options.donutWidth);\n    if (donutWidth.unit === '%') {\n      donutWidth.value *= radius / 100;\n    }\n\n    // If this is a donut chart we need to adjust our radius to enable strokes to be drawn inside\n    // Unfortunately this is not possible with the current SVG Spec\n    // See this proposal for more details: http://lists.w3.org/Archives/Public/www-svg/2003Oct/0000.html\n    radius -= options.donut && !options.donutSolid ? donutWidth.value / 2  : 0;\n\n    // If labelPosition is set to `outside` or a donut chart is drawn then the label position is at the radius,\n    // if regular pie chart it's half of the radius\n    if(options.labelPosition === 'outside' || options.donut && !options.donutSolid) {\n      labelRadius = radius;\n    } else if(options.labelPosition === 'center') {\n      // If labelPosition is center we start with 0 and will later wait for the labelOffset\n      labelRadius = 0;\n    } else if(options.donutSolid) {\n      labelRadius = radius - donutWidth.value / 2;\n    } else {\n      // Default option is 'inside' where we use half the radius so the label will be placed in the center of the pie\n      // slice\n      labelRadius = radius / 2;\n    }\n    // Add the offset to the labelRadius where a negative offset means closed to the center of the chart\n    labelRadius += options.labelOffset;\n\n    // Calculate end angle based on total sum and current data value and offset with padding\n    var center = {\n      x: chartRect.x1 + chartRect.width() / 2,\n      y: chartRect.y2 + chartRect.height() / 2\n    };\n\n    // Check if there is only one non-zero value in the series array.\n    var hasSingleValInSeries = data.raw.series.filter(function(val) {\n      return val.hasOwnProperty('value') ? val.value !== 0 : val !== 0;\n    }).length === 1;\n\n    // Creating the series groups\n    data.raw.series.forEach(function(series, index) {\n      seriesGroups[index] = this.svg.elem('g', null, null);\n    }.bind(this));\n    //if we need to show labels we create the label group now\n    if(options.showLabel) {\n      labelsGroup = this.svg.elem('g', null, null);\n    }\n\n    // Draw the series\n    // initialize series groups\n    data.raw.series.forEach(function(series, index) {\n      // If current value is zero and we are ignoring empty values then skip to next value\n      if (data.normalized.series[index] === 0 && options.ignoreEmptyValues) return;\n\n      // If the series is an object and contains a name or meta data we add a custom attribute\n      seriesGroups[index].attr({\n        'ct:series-name': series.name\n      });\n\n      // Use series class from series data or if not set generate one\n      seriesGroups[index].addClass([\n        options.classNames.series,\n        (series.className || options.classNames.series + '-' + Chartist.alphaNumerate(index))\n      ].join(' '));\n\n      // If the whole dataset is 0 endAngle should be zero. Can't divide by 0.\n      var endAngle = (totalDataSum > 0 ? startAngle + data.normalized.series[index] / totalDataSum * 360 : 0);\n\n      // Use slight offset so there are no transparent hairline issues\n      var overlappigStartAngle = Math.max(0, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2));\n\n      // If we need to draw the arc for all 360 degrees we need to add a hack where we close the circle\n      // with Z and use 359.99 degrees\n      if(endAngle - overlappigStartAngle >= 359.99) {\n        endAngle = overlappigStartAngle + 359.99;\n      }\n\n      var start = Chartist.polarToCartesian(center.x, center.y, radius, overlappigStartAngle),\n        end = Chartist.polarToCartesian(center.x, center.y, radius, endAngle);\n\n      var innerStart,\n        innerEnd,\n        donutSolidRadius;\n\n      // Create a new path element for the pie chart. If this isn't a donut chart we should close the path for a correct stroke\n      var path = new Chartist.Svg.Path(!options.donut || options.donutSolid)\n        .move(end.x, end.y)\n        .arc(radius, radius, 0, endAngle - startAngle > 180, 0, start.x, start.y);\n\n      // If regular pie chart (no donut) we add a line to the center of the circle for completing the pie\n      if(!options.donut) {\n        path.line(center.x, center.y);\n      } else if (options.donutSolid) {\n        donutSolidRadius = radius - donutWidth.value;\n        innerStart = Chartist.polarToCartesian(center.x, center.y, donutSolidRadius, startAngle - (index === 0 || hasSingleValInSeries ? 0 : 0.2));\n        innerEnd = Chartist.polarToCartesian(center.x, center.y, donutSolidRadius, endAngle);\n        path.line(innerStart.x, innerStart.y);\n        path.arc(donutSolidRadius, donutSolidRadius, 0, endAngle - startAngle  > 180, 1, innerEnd.x, innerEnd.y);\n      }\n\n      // Create the SVG path\n      // If this is a donut chart we add the donut class, otherwise just a regular slice\n      var pathClassName = options.classNames.slicePie;\n      if (options.donut) {\n        pathClassName = options.classNames.sliceDonut;\n        if (options.donutSolid) {\n          pathClassName = options.classNames.sliceDonutSolid;\n        }\n      }\n      var pathElement = seriesGroups[index].elem('path', {\n        d: path.stringify()\n      }, pathClassName);\n\n      // Adding the pie series value to the path\n      pathElement.attr({\n        'ct:value': data.normalized.series[index],\n        'ct:meta': Chartist.serialize(series.meta)\n      });\n\n      // If this is a donut, we add the stroke-width as style attribute\n      if(options.donut && !options.donutSolid) {\n        pathElement._node.style.strokeWidth = donutWidth.value + 'px';\n      }\n\n      // Fire off draw event\n      this.eventEmitter.emit('draw', {\n        type: 'slice',\n        value: data.normalized.series[index],\n        totalDataSum: totalDataSum,\n        index: index,\n        meta: series.meta,\n        series: series,\n        group: seriesGroups[index],\n        element: pathElement,\n        path: path.clone(),\n        center: center,\n        radius: radius,\n        startAngle: startAngle,\n        endAngle: endAngle\n      });\n\n      // If we need to show labels we need to add the label for this slice now\n      if(options.showLabel) {\n        var labelPosition;\n        if(data.raw.series.length === 1) {\n          // If we have only 1 series, we can position the label in the center of the pie\n          labelPosition = {\n            x: center.x,\n            y: center.y\n          };\n        } else {\n          // Position at the labelRadius distance from center and between start and end angle\n          labelPosition = Chartist.polarToCartesian(\n            center.x,\n            center.y,\n            labelRadius,\n            startAngle + (endAngle - startAngle) / 2\n          );\n        }\n\n        var rawValue;\n        if(data.normalized.labels && !Chartist.isFalseyButZero(data.normalized.labels[index])) {\n          rawValue = data.normalized.labels[index];\n        } else {\n          rawValue = data.normalized.series[index];\n        }\n\n        var interpolatedValue = options.labelInterpolationFnc(rawValue, index);\n\n        if(interpolatedValue || interpolatedValue === 0) {\n          var labelElement = labelsGroup.elem('text', {\n            dx: labelPosition.x,\n            dy: labelPosition.y,\n            'text-anchor': determineAnchorPosition(center, labelPosition, options.labelDirection)\n          }, options.classNames.label).text('' + interpolatedValue);\n\n          // Fire off draw event\n          this.eventEmitter.emit('draw', {\n            type: 'label',\n            index: index,\n            group: labelsGroup,\n            element: labelElement,\n            text: '' + interpolatedValue,\n            x: labelPosition.x,\n            y: labelPosition.y\n          });\n        }\n      }\n\n      // Set next startAngle to current endAngle.\n      // (except for last slice)\n      startAngle = endAngle;\n    }.bind(this));\n\n    this.eventEmitter.emit('created', {\n      chartRect: chartRect,\n      svg: this.svg,\n      options: options\n    });\n  }\n\n  /**\n   * This method creates a new pie chart and returns an object that can be used to redraw the chart.\n   *\n   * @memberof Chartist.Pie\n   * @param {String|Node} query A selector query string or directly a DOM element\n   * @param {Object} data The data object in the pie chart needs to have a series property with a one dimensional data array. The values will be normalized against each other and don't necessarily need to be in percentage. The series property can also be an array of value objects that contain a value property and a className property to override the CSS class name for the series group.\n   * @param {Object} [options] The options object with options that override the default options. Check the examples for a detailed list.\n   * @param {Array} [responsiveOptions] Specify an array of responsive option arrays which are a media query and options object pair => [[mediaQueryString, optionsObject],[more...]]\n   * @return {Object} An object with a version and an update method to manually redraw the chart\n   *\n   * @example\n   * // Simple pie chart example with four series\n   * new Chartist.Pie('.ct-chart', {\n   *   series: [10, 2, 4, 3]\n   * });\n   *\n   * @example\n   * // Drawing a donut chart\n   * new Chartist.Pie('.ct-chart', {\n   *   series: [10, 2, 4, 3]\n   * }, {\n   *   donut: true\n   * });\n   *\n   * @example\n   * // Using donut, startAngle and total to draw a gauge chart\n   * new Chartist.Pie('.ct-chart', {\n   *   series: [20, 10, 30, 40]\n   * }, {\n   *   donut: true,\n   *   donutWidth: 20,\n   *   startAngle: 270,\n   *   total: 200\n   * });\n   *\n   * @example\n   * // Drawing a pie chart with padding and labels that are outside the pie\n   * new Chartist.Pie('.ct-chart', {\n   *   series: [20, 10, 30, 40]\n   * }, {\n   *   chartPadding: 30,\n   *   labelOffset: 50,\n   *   labelDirection: 'explode'\n   * });\n   *\n   * @example\n   * // Overriding the class names for individual series as well as a name and meta data.\n   * // The name will be written as ct:series-name attribute and the meta data will be serialized and written\n   * // to a ct:meta attribute.\n   * new Chartist.Pie('.ct-chart', {\n   *   series: [{\n   *     value: 20,\n   *     name: 'Series 1',\n   *     className: 'my-custom-class-one',\n   *     meta: 'Meta One'\n   *   }, {\n   *     value: 10,\n   *     name: 'Series 2',\n   *     className: 'my-custom-class-two',\n   *     meta: 'Meta Two'\n   *   }, {\n   *     value: 70,\n   *     name: 'Series 3',\n   *     className: 'my-custom-class-three',\n   *     meta: 'Meta Three'\n   *   }]\n   * });\n   */\n  function Pie(query, data, options, responsiveOptions) {\n    Chartist.Pie.super.constructor.call(this,\n      query,\n      data,\n      defaultOptions,\n      Chartist.extend({}, defaultOptions, options),\n      responsiveOptions);\n  }\n\n  // Creating pie chart type in Chartist namespace\n  Chartist.Pie = Chartist.Base.extend({\n    constructor: Pie,\n    createChart: createChart,\n    determineAnchorPosition: determineAnchorPosition\n  });\n\n}(this || global, Chartist));\n\nreturn Chartist;\n\n}));\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n  if (a === b) return true;\n\n  if (a && b && typeof a == 'object' && typeof b == 'object') {\n    if (a.constructor !== b.constructor) return false;\n\n    var length, i, keys;\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0;)\n        if (!equal(a[i], b[i])) return false;\n      return true;\n    }\n\n\n\n    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) return false;\n\n    for (i = length; i-- !== 0;)\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n    for (i = length; i-- !== 0;) {\n      var key = keys[i];\n\n      if (!equal(a[key], b[key])) return false;\n    }\n\n    return true;\n  }\n\n  // true if both NaN, false otherwise\n  return a!==a && b!==b;\n};\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {BiolinkWidget} from './biolink-widget';\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class BiolinkWidgetsService {\n    static BASE_URI = 'biolink-widgets';\n    constructor(private http: AppHttpClient) {}\n\n    create(\n        biolinkId: number,\n        type: string,\n        position: number,\n        config: object\n    ): BackendResponse<{widget: BiolinkWidget}> {\n        return this.http.post(`biolink/${biolinkId}/widget`, {type, position, config});\n    }\n\n    update(\n        biolinkId: number,\n        widgetId: number,\n        config: object\n    ): BackendResponse<{widget: BiolinkWidget}> {\n        return this.http.put(`biolink/${biolinkId}/widget/${widgetId}`, {\n            config,\n        });\n    }\n\n    delete(biolinkId: number, widgetIds: number[]): BackendResponse<void> {\n        return this.http.delete(`biolink/${biolinkId}/widget/${widgetIds}`);\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {Biolink} from '../biolink';\nimport {BiolinkItemConfig, BiolinksService} from '../biolinks.service';\nimport { finalize, tap } from 'rxjs/operators';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {FormBuilder} from '@angular/forms';\nimport {BiolinkWidgetsService} from './widgets/biolink-widgets.service';\nimport {Link} from '../../../shared/link/link';\nimport {\n    CrupdateLinkModalComponent,\n    CrupdateLinkModalData,\n} from '../../link/crupdate-link-modal/crupdate-link-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {BiolinkWidget} from './widgets/biolink-widget';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {BiolinkLink} from './biolink-link';\n\nexport const BiolinkEditorTabs = {\n    links: 0,\n    appearance: 1,\n    settings: 2,\n};\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class BiolinkEditorService {\n    biolink$ = new BehaviorSubject<Biolink>(null);\n    loading$ = new BehaviorSubject<boolean>(false);\n    activeTab$ = new BehaviorSubject<number>(BiolinkEditorTabs.links);\n\n    appearanceForm = this.fb.group({\n        fontConfig: {},\n        btnConfig: this.fb.group({\n            color: this.fb.control(''),\n            variant: this.fb.control(''),\n            type: this.fb.control(''),\n        }),\n        bgConfig: {},\n    });\n\n    constructor(\n        public biolinks: BiolinksService,\n        private toast: Toast,\n        private fb: FormBuilder,\n        private widgets: BiolinkWidgetsService,\n        private modal: Modal\n    ) {}\n\n    saveAppearance() {\n        this.loading$.next(true);\n        return this.biolinks\n            .saveAppearance(this.biolink$.value.id, this.appearanceForm.value)\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(() => {\n                this.toast.open('Appearance saved');\n            });\n    }\n\n    reloadBiolink(biolinkId?: number) {\n        biolinkId = biolinkId || this.biolink$.value.id;\n        this.loading$.next(true);\n        this.biolinks\n            .get(biolinkId, {with: ['appearance', 'rules', 'pixels', 'domain']})\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(response => {\n                this.biolink$.next(response.biolink);\n                this.appearanceForm.patchValue(\n                    response.biolink.appearance?.config\n                );\n            });\n    }\n\n    crupdateWidget(widgetId: number, type: string, config: object) {\n        this.loading$.next(true);\n        const request = widgetId\n            ? this.widgets.update(this.biolink$.value.id, widgetId, config)\n            : this.widgets.create(\n                  this.biolink$.value.id,\n                  type,\n                  this.biolink$.value.content.length + 1,\n                  config\n              );\n        return request.pipe(\n            finalize(() => this.loading$.next(false)),\n            tap(() =>  this.reloadBiolink()),\n        );\n    }\n\n    openCrupdateLinkDialog(link?: Link, config: CrupdateLinkModalData = {}) {\n        const position = this.biolink$.value.content.length + 1;\n        const pivotData = link ? {} : {position};\n        const baseConfig: CrupdateLinkModalData = {\n            groups: {[this.biolink$.value.id]: pivotData},\n            link,\n            featuresToHide: {\n                alias: true,\n                domain: true,\n                linkGroups: true,\n                tags: true,\n            },\n        };\n        this.modal\n            .open(CrupdateLinkModalComponent, {...baseConfig, ...config})\n            .afterClosed()\n            .subscribe(newLink => {\n                if (newLink) {\n                    this.reloadBiolink();\n                }\n            });\n    }\n\n    maybeDeleteContentItem(item: BiolinkLink | BiolinkWidget) {\n        this.modal\n            .open(ConfirmModalComponent, {\n                title: 'Delete Widget',\n                body: `Are you sure you want to delete this ${item.model_type}?`,\n                ok: 'Delete',\n            })\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (!confirmed) return;\n                this.loading$.next(true);\n                this.biolinks\n                    .detach(this.biolink$.value.id, item)\n                    .pipe(finalize(() => this.loading$.next(false)))\n                    .subscribe(() => {\n                        this.reloadBiolink(this.biolink$.value.id);\n                    });\n            });\n    }\n\n    updateContentItemConfig(\n        item: Link | BiolinkWidget,\n        config: BiolinkItemConfig\n    ) {\n        this.loading$.next(true);\n        this.biolinks\n            .updateContentItemConfig(this.biolink$.value.id, item, config)\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(() => {\n                this.reloadBiolink();\n            });\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update image widget</span>\n    <span *ngIf=\"!data.config\">Add image widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content class=\"many-inputs\">\n    <upload-image-control formControlName=\"url\"></upload-image-control>\n\n    <div class=\"input-container\">\n      <label for=\"image-widget-type\" class=\"capitalize\" trans>Type</label>\n      <select id=\"image-widget-type\" formControlName=\"type\">\n        <option value=\"default\" trans>Default</option>\n        <option value=\"avatar\" trans>Avatar</option>\n      </select>\n    </div>\n\n    <div class=\"input-container\">\n      <label for=\"image-widget-link\" cdkFocusInitial class=\"capitalize\" trans>Destination Url</label>\n      <input type=\"url\" id=\"image-widget-link\" placeholder=\"Optional...\" trans-placeholder formControlName=\"destinationUrl\" />\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BiolinkWidgetsService} from '../biolink-widgets.service';\nimport {BehaviorSubject} from 'rxjs';\nimport {finalize} from 'rxjs/operators';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: object;\n}\n\n@Component({\n    selector: 'image-widget-modal',\n    templateUrl: './image-widget-modal.component.html',\n    styleUrls: ['./image-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ImageWidgetModalComponent {\n    form = new FormGroup({\n        url: new FormControl(),\n        destinationUrl: new FormControl(),\n        type: new FormControl('default'),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<ImageWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService\n    ) {\n        if (data.config) {\n            this.form.patchValue(data.config);\n        }\n    }\n\n    createOrUpdate() {\n        this.editor\n            .crupdateWidget(this.data.widgetId, 'image', this.form.value)\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update youtube widget</span>\n    <span *ngIf=\"!data.config\">Add youtube widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content>\n    <div class=\"input-container\">\n      <label for=\"youtube-widget-url\" trans>Youtube Url</label>\n      <input\n        type=\"url\"\n        id=\"youtube-widget-url\"\n        formControlName=\"url\"\n        placeholder=\"https://www.youtube.com/watch?v=YE7VzlLtp-4\"\n        cdkFocusInitial\n        required\n      />\n      <div class=\"error\" *ngIf=\"(errors$ | async).url as error\" trans>{{ error }}</div>\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport getVideoId from 'get-video-id';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: {url?: string};\n}\n\n@Component({\n    selector: 'youtube-widget-modal',\n    templateUrl: './youtube-widget-modal.component.html',\n    styleUrls: ['./youtube-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class YoutubeWidgetModalComponent {\n    static type = 'youtubeEmbed';\n    errors$ = new BehaviorSubject<{url?: string}>({});\n    form = new FormGroup({\n        url: new FormControl(''),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<YoutubeWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService\n    ) {\n        if (data.config?.url) {\n            this.form.patchValue({\n                url: data.config?.url,\n            });\n        }\n    }\n\n    createOrUpdate() {\n        const youtubeId = getVideoId(this.form.value.url).id;\n        if (!youtubeId) {\n            return this.errors$.next({url: 'This is not a valid youtube url.'});\n        }\n        this.editor\n            .crupdateWidget(\n                this.data.widgetId,\n                YoutubeWidgetModalComponent.type,\n                this.form.value\n            )\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update soundcloud widget</span>\n    <span *ngIf=\"!data.config\">Add soundcloud widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content>\n    <div class=\"input-container\">\n      <label for=\"soundcloud-widget-url\" trans>Soundcloud Url</label>\n      <input\n        type=\"url\"\n        id=\"soundcloud-widget-url\"\n        formControlName=\"url\"\n        placeholder=\"https://soundcloud.com/arianagrande/ariana-grande-test-drive\"\n        cdkFocusInitial\n        required\n      />\n      <div class=\"error\" *ngIf=\"(errors$ | async).url as error\" trans>{{ error }}</div>\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: {url: string; embedCode: string};\n}\n\n@Component({\n    selector: 'soundcloud-widget-modal',\n    templateUrl: './soundcloud-widget-modal.component.html',\n    styleUrls: ['./soundcloud-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SoundcloudWidgetModalComponent {\n    static type: 'soundcloudEmbed';\n    errors$ = new BehaviorSubject<{url?: string}>({});\n    form = new FormGroup({\n        url: new FormControl(''),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<SoundcloudWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        private http: AppHttpClient,\n        public editor: BiolinkEditorService\n    ) {\n        if (data.config) {\n            this.form.patchValue(data.config);\n        }\n    }\n\n    createOrUpdate() {\n        this.editor.loading$.next(true);\n        const encodedUrl = encodeURIComponent(this.form.value.url);\n        this.http\n            .get('https://soundcloud.com/oembed?format=json&url=' + encodedUrl)\n            .subscribe(\n                response => {\n                    let embedCode = (response as any).html;\n                    if (!embedCode) {\n                        this.editor.loading$.next(false);\n                        return this.errors$.next({\n                            url: 'This is not a valid soundcloud url.',\n                        });\n                    }\n                    embedCode = embedCode.replace(\n                        'height=\"400\"',\n                        'height=\"180\"'\n                    );\n\n                    this.editor\n                        .crupdateWidget(\n                            this.data.widgetId,\n                            SoundcloudWidgetModalComponent.type,\n                            {\n                                embedCode,\n                                url: this.form.value.url,\n                            }\n                        )\n                        .subscribe(r => {\n                            this.dialogRef.close(r.widget);\n                        });\n                },\n                () => {\n                    this.editor.loading$.next(false);\n                    this.errors$.next({\n                        url: 'Could not get soundcloud embed code, try again later.',\n                    });\n                }\n            );\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update vimeo widget</span>\n    <span *ngIf=\"!data.config\">Add vimeo widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content>\n    <div class=\"input-container\">\n      <label for=\"youtube-widget-url\" trans>Vimeo Url</label>\n      <input\n        type=\"url\"\n        id=\"youtube-widget-url\"\n        formControlName=\"url\"\n        placeholder=\"https://vimeo.com/1084537\"\n        cdkFocusInitial\n        required\n      />\n      <div class=\"error\" *ngIf=\"(errors$ | async).url as error\" trans>{{ error }}</div>\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport getVideoId from 'get-video-id';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: {url?: string};\n}\n\n@Component({\n    selector: 'vimeo-widget-modal',\n    templateUrl: './vimeo-widget-modal.component.html',\n    styleUrls: ['./vimeo-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VimeoWidgetModalComponent {\n    static widgetType = 'vimeoEmbed';\n    errors$ = new BehaviorSubject<{url?: string}>({});\n    form = new FormGroup({\n        url: new FormControl(''),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<VimeoWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService\n    ) {\n        if (data.config?.url) {\n            this.form.patchValue({\n                url: data.config?.url,\n            });\n        }\n    }\n\n    createOrUpdate() {\n        const vimeoId = getVideoId(this.form.value.url).id;\n        if (!vimeoId) {\n            return this.errors$.next({url: 'This is not a valid vimeo url.'});\n        }\n        this.editor\n            .crupdateWidget(\n                this.data.widgetId,\n                VimeoWidgetModalComponent.widgetType,\n                this.form.value\n            )\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update spotify widget</span>\n    <span *ngIf=\"!data.config\">Add spotify widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content>\n    <div class=\"input-container\">\n      <label for=\"spotify-widget-url\" trans>Spotify Url</label>\n      <input\n        type=\"url\"\n        id=\"spotify-widget-url\"\n        formControlName=\"url\"\n        placeholder=\"https://open.spotify.com/track/2sqfLwGKXDw1nGjFhH3GGX?si=f329040f45804ec5\"\n        cdkFocusInitial\n        required\n      />\n      <div class=\"error\" *ngIf=\"(errors$ | async).url as error\" trans>{{ error }}</div>\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport * as parseSpotifyUri from 'spotify-uri';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: {url?: string};\n}\n\n@Component({\n    selector: 'spotify-widget-modal',\n    templateUrl: './spotify-widget-modal.component.html',\n    styleUrls: ['./spotify-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpotifyWidgetModalComponent {\n    static type = 'spotifyEmbed';\n    errors$ = new BehaviorSubject<{url?: string}>({});\n    form = new FormGroup({\n        url: new FormControl(''),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<SpotifyWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService,\n    ) {\n        if (data.config?.url) {\n            this.form.patchValue({url: data.config?.url});\n        }\n    }\n\n    createOrUpdate() {\n        const spotifyInfo = parseSpotifyUri(this.form.value.url);\n        if (!('id' in spotifyInfo)) {\n            return this.errors$.next({url: 'This is not a valid spotify url.'});\n        }\n\n        this.editor\n            .crupdateWidget(this.data.widgetId, SpotifyWidgetModalComponent.type, this.form.value)\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update twitch widget</span>\n    <span *ngIf=\"!data.config\">Add twitch widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content>\n    <div class=\"input-container\">\n      <label for=\"twitch-widget-url\" trans>Twitch Url</label>\n      <input\n        type=\"url\"\n        id=\"twitch-widget-url\"\n        formControlName=\"url\"\n        placeholder=\"https://www.twitch.tv/kasparovchess\"\n        cdkFocusInitial\n        required\n      />\n      <div class=\"error\" *ngIf=\"(errors$ | async).url as error\" trans>{{ error }}</div>\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: {url?: string};\n}\n\n@Component({\n    selector: 'twitch-widget-modal',\n    templateUrl: './twitch-widget-modal.component.html',\n    styleUrls: ['./twitch-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TwitchWidgetModalComponent {\n    static type = 'twitchEmbed';\n    errors$ = new BehaviorSubject<{url?: string}>({});\n    form = new FormGroup({\n        url: new FormControl(''),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<TwitchWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService\n    ) {\n        if (data.config?.url) {\n            this.form.patchValue({url: data.config?.url});\n        }\n    }\n\n    createOrUpdate() {\n        if (!this.form.value.url.includes('twitch.tv/')) {\n            return this.errors$.next({url: 'This is not a valid twitch url.'});\n        }\n        this.editor\n            .crupdateWidget(\n                this.data.widgetId,\n                TwitchWidgetModalComponent.type,\n                this.form.value\n            )\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update tiktok widget</span>\n    <span *ngIf=\"!data.config\">Add tiktok widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content>\n    <div class=\"input-container\">\n      <label for=\"tiktok-widget-url\" trans>TikTok Url</label>\n      <input\n        type=\"url\"\n        id=\"tiktok-widget-url\"\n        formControlName=\"url\"\n        placeholder=\"https://www.tiktok.com/@bts_official_bighit/video/6964945720885464322\"\n        cdkFocusInitial\n        required\n      />\n      <div class=\"error\" *ngIf=\"(errors$ | async).url as error\" trans>{{ error }}</div>\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: {url?: string};\n}\n\n@Component({\n    selector: 'tiktok-widget-modal',\n    templateUrl: './tiktok-widget-modal.component.html',\n    styleUrls: ['./tiktok-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TiktokWidgetModalComponent {\n    static type = 'tiktokEmbed';\n    errors$ = new BehaviorSubject<{url?: string}>({});\n    form = new FormGroup({\n        url: new FormControl(''),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<TiktokWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService\n    ) {\n        if (data.config?.url) {\n            this.form.patchValue({url: data.config?.url});\n        }\n    }\n\n    createOrUpdate() {\n        if (!this.form.value.url.includes('tiktok.com/')) {\n            return this.errors$.next({url: 'This is not a valid tiktok url.'});\n        }\n        this.editor\n            .crupdateWidget(\n                this.data.widgetId,\n                TiktokWidgetModalComponent.type,\n                this.form.value\n            )\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update text widget</span>\n    <span *ngIf=\"!data.config\">Add text widget</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content class=\"many-inputs\">\n    <div class=\"input-container\">\n      <label for=\"text-widget-title\" class=\"capitalize\" trans>Title</label>\n      <input cdkFocusInitial type=\"text\" id=\"text-widget-title\" formControlName=\"title\" required/>\n    </div>\n  </div>\n\n  <div class=\"input-container\">\n    <label for=\"text-widget-description\" class=\"capitalize\" trans>Description</label>\n    <input type=\"text\" id=\"text-widget-description\" formControlName=\"description\" />\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","export interface SocialWidgetService {\n    name: string;\n    type: string;\n    placeholder: string;\n    inputType?: string;\n    pattern?: string;\n}\n\nexport const SOCIALS_WIDGET_SERVICES: SocialWidgetService[] = [\n    {\n        name: 'Email',\n        type: 'mail',\n        placeholder: 'your@email.com',\n        inputType: 'email',\n    },\n    {\n        name: 'Facebook Url',\n        type: 'facebook',\n        placeholder: 'https://facebook.com/username',\n        pattern: 'https://facebook.com/[a-zA-Z0-9._]+$',\n        inputType: 'url',\n    },\n    {\n        name: 'Twitter Handle',\n        type: 'twitter',\n        placeholder: '@yourtwitterhandle',\n        pattern: '^@[A-Za-z0-9_]{1,15}$',\n    },\n    {\n        name: 'Instagram Username',\n        type: 'instagram',\n        placeholder: '@instagramusername',\n        pattern: '^@[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'TikTok Username',\n        type: 'tiktok',\n        placeholder: '@tiktokusername',\n        pattern: '^@[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Youtube Channel Url',\n        type: 'youtube',\n        placeholder: 'https://youtube.com/channel/youtubechannelurl',\n        inputType: 'url',\n        pattern: 'https://youtube.com/channel/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'SoundCloud Url',\n        type: 'soundcloud',\n        placeholder: 'https://soundcloud.com/username',\n        inputType: 'url',\n        pattern: 'https://soundcloud.com/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Bandcamp Url',\n        type: 'bandcamp',\n        placeholder: 'https://you.bandcamp.com',\n        inputType: 'url',\n        pattern: 'https://[a-zA-Z0-9._]+.bandcamp.com$',\n    },\n    {\n        name: 'LinkedIn Url',\n        type: 'linkedin',\n        placeholder: 'https://linkedin.com/in/username',\n        inputType: 'url',\n        pattern: 'https://linkedin.com/in/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'WhatsApp',\n        type: 'whatsapp',\n        placeholder: '+00000000000',\n        pattern: '^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\\\s\\\\./0-9]*$',\n    },\n    {\n        name: 'Telegram Url',\n        type: 'telegram',\n        placeholder: 'https://t.me/',\n        inputType: 'url',\n        pattern: 'https://t.me/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Twitch Url',\n        type: 'twitch',\n        placeholder: 'https://twitch.tv/username',\n        inputType: 'url',\n        pattern: 'https://twitch.tv/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Patreon Url',\n        type: 'patreon',\n        placeholder: 'https://patreon.com/username',\n        inputType: 'url',\n        pattern: 'https://patreon.com/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Pinterest Url',\n        type: 'pinterest',\n        placeholder: 'https://pinterest.com/',\n        inputType: 'url',\n        pattern: 'https://pinterest.com/.+',\n    },\n    {\n        name: 'Spotify Artist Url',\n        type: 'spotify',\n        placeholder: 'https://open.spotify.com/artist/artistname',\n        inputType: 'url',\n        pattern: 'https://open.spotify.com/artist/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Amazon Shop Url',\n        type: 'amazon',\n        placeholder: 'https://amazon.com/shop/yourshopname',\n        inputType: 'url',\n        pattern: 'https://amazon.com/shop/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Snapchat Url',\n        type: 'snapchat',\n        placeholder: 'https://www.snapchat.com/add/yourusername',\n        inputType: 'url',\n        pattern: 'https://www.snapchat.com/add/[a-zA-Z0-9._]+$',\n    },\n    {\n        name: 'Apple Music Url',\n        type: 'apple',\n        placeholder: 'https://music.apple.com/us/album/youralbum',\n        inputType: 'url',\n        pattern: 'https://music.apple.com/.+',\n    },\n];\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>\n    <span *ngIf=\"data.config\" trans>Update social links</span>\n    <span *ngIf=\"!data.config\">Add social links</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"createOrUpdate()\" [formGroup]=\"form\" ngNativeValidate>\n  <div mat-dialog-content class=\"many-inputs\">\n    <div class=\"input-container\" *ngFor=\"let service of services\">\n      <label [for]=\"service.name\" class=\"capitalize\" trans>{{ service.name }}</label>\n      <input\n        autocomplete=\"false\"\n        [type]=\"service.inputType || 'text'\"\n        [pattern]=\"service.pattern\"\n        [placeholder]=\"service.placeholder\"\n        [id]=\"service.name\"\n        [formControlName]=\"service.type\"\n      />\n    </div>\n  </div>\n\n  <div class=\"buttons right\" mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button class=\"button cancel cancel-button\" trans>\n      Cancel\n    </button>\n    <button\n      type=\"submit\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"editor.loading$ | async\"\n      class=\"button primary submit-button\"\n    >\n      <span *ngIf=\"data.config\" trans>Update</span>\n      <span *ngIf=\"!data.config\" trans>Add</span>\n    </button>\n  </div>\n</form>\n","import {ImageWidgetModalComponent} from './image-widget-modal/image-widget-modal.component';\nimport {YoutubeWidgetModalComponent} from './youtube-widget-modal/youtube-widget-modal.component';\nimport {ComponentType} from '@angular/cdk/portal';\nimport { SoundcloudWidgetModalComponent } from './soundcloud-widget-modal/soundcloud-widget-modal.component';\nimport { VimeoWidgetModalComponent } from './vimeo-widget-modal/vimeo-widget-modal.component';\nimport { SpotifyWidgetModalComponent } from './spotify-widget-modal/spotify-widget-modal.component';\nimport { TwitchWidgetModalComponent } from './twitch-widget-modal/twitch-widget-modal.component';\nimport { TiktokWidgetModalComponent } from './tiktok-widget-modal/tiktok-widget-modal.component';\nimport { TextWidgetModalComponent } from './text-widget-modal/text-widget-modal.component';\nimport { SocialsWidgetModalComponent } from './socials-widget-modal/socials-widget-modal.component';\n\nexport const WIDGET_LIST: {\n    type: string;\n    name?: string;\n    description: string;\n    image?: string;\n    component: ComponentType<any>;\n}[] = [\n    {\n        type: 'image',\n        image: 'image.png',\n        description:\n            'Upload an image and optionally add a link it will redirect to when clicked.',\n        component: ImageWidgetModalComponent,\n    },\n    {\n        type: 'text',\n        image: 'text.png',\n        description:\n            'Add title and optional description. Can be used as a header for the whole biolink or a group of multiple widgets.',\n        component: TextWidgetModalComponent,\n    },\n    {\n        type: 'socials',\n        name: 'Social Links',\n        image: 'socials.png',\n        description:\n            'Add your socials links to display them as icon buttons.',\n        component: SocialsWidgetModalComponent,\n    },\n    {\n        name: 'Youtube Video',\n        type: 'youtubeEmbed',\n        image: 'youtube.png',\n        description:\n            'Paste a YouTube video URL to show it as a video embed in your profile.',\n        component: YoutubeWidgetModalComponent\n    },\n    {\n        name: 'Soundcloud Video',\n        type: 'soundcloudEmbed',\n        image: 'soundcloud.png',\n        description:\n            'Paste a SoundCloud URL to show it as a playable song in your profile.',\n        component: SoundcloudWidgetModalComponent\n    },\n    {\n        name: 'Vimeo Video',\n        type: 'vimeoEmbed',\n        image: 'vimeo.jpeg',\n        description:\n            'Paste a vimeo URL to show it as a video embed in your profile.',\n        component: VimeoWidgetModalComponent\n    },\n    {\n        name: 'Spotify Embed',\n        type: 'spotifyEmbed',\n        image: 'spotify.png',\n        description:\n            'Paste a spotify song, album, artist, playlist, podcast or episode url to show it as an embed in your profile.',\n        component: SpotifyWidgetModalComponent\n    },\n    {\n        name: 'Twitch Embed',\n        type: 'twitchEmbed',\n        image: 'twitch.svg',\n        description:\n            'Paste twitch profile or clip url to show it as an embed in your profile.',\n        component: TwitchWidgetModalComponent,\n    },\n    {\n        name: 'TikTok Embed',\n        type: 'tiktokEmbed',\n        image: 'tiktok.png',\n        description:\n            'Paste TikTok video url to show it as an embed in your profile.',\n        component: TiktokWidgetModalComponent,\n    },\n];\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    widgetId?: number;\n    config?: object;\n}\n\n@Component({\n    selector: 'text-widget-modal',\n    templateUrl: './text-widget-modal.component.html',\n    styleUrls: ['./text-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextWidgetModalComponent {\n    form = new FormGroup({\n        title: new FormControl(),\n        description: new FormControl(),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<TextWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService,\n    ) {\n        if (data.config) {\n            this.form.patchValue(data.config);\n        }\n    }\n\n    createOrUpdate() {\n        this.editor\n            .crupdateWidget(this.data.widgetId, 'text', this.form.value)\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {SOCIALS_WIDGET_SERVICES} from './socials-widget-services';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\nexport interface CrupdateWidgetDialogData {\n    biolinkId: number;\n    widgetId?: number;\n    config?: object;\n}\n\n@Component({\n    selector: 'socials-widget-modal',\n    templateUrl: './socials-widget-modal.component.html',\n    styleUrls: ['./socials-widget-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SocialsWidgetModalComponent {\n    services = SOCIALS_WIDGET_SERVICES;\n    form = new FormGroup({});\n\n    constructor(\n        private dialogRef: MatDialogRef<SocialsWidgetModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWidgetDialogData,\n        public editor: BiolinkEditorService\n    ) {\n        this.services.forEach(service => {\n            this.form.addControl(service.type, new FormControl());\n        });\n        if (data.config) {\n            this.form.patchValue(data.config);\n        }\n    }\n\n    createOrUpdate() {\n        this.editor\n            .crupdateWidget(this.data.widgetId, 'socials', this.form.value)\n            .subscribe(response => {\n                this.dialogRef.close(response.widget);\n            });\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n  <h2 class=\"modal-title\" mat-dialog-title>Add New Widget</h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<div mat-dialog-content>\n  <div class=\"widgets\">\n    <div class=\"widget\" mat-ripple (click)=\"openWidgetDialog(widget.component)\" *ngFor=\"let widget of widgets\">\n      <img [src]=\"settings.getAssetUrl('images/widgets/' + widget.image)\" class=\"widget-img\" alt=\"\">\n      <div class=\"name\" trans>{{widget.name || widget.type}}</div>\n      <div class=\"description\" trans>{{widget.description}}</div>\n    </div>\n  </div>\n</div>\n","import {ChangeDetectionStrategy, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {Settings} from '@common/core/config/settings.service';\nimport {WIDGET_LIST} from '../widget-list';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {ComponentType} from '@angular/cdk/portal';\n\n@Component({\n    selector: 'widget-list-modal',\n    templateUrl: './widget-list-modal.component.html',\n    styleUrls: ['./widget-list-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WidgetListModalComponent {\n    widgets = WIDGET_LIST;\n\n    constructor(\n        private dialogRef: MatDialogRef<WidgetListModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: {biolinkId: number},\n        public settings: Settings,\n        private modal: Modal\n    ) {}\n\n    openWidgetDialog(component: ComponentType<any>) {\n        this.close();\n        this.modal.open(component, this.data);\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Input,\n    Output,\n    EventEmitter,\n} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\n@Component({\n    selector: 'biolink-slideout-panel',\n    templateUrl: './biolink-slideout-panel.component.html',\n    styleUrls: ['./biolink-slideout-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BiolinkSlideoutPanelComponent {\n    @Input() title: string;\n    @Output() closed = new EventEmitter();\n    visible$  = new BehaviorSubject<boolean>(false);\n}\n","<div class=\"header\">\n  <div class=\"title\">{{title | trans}}</div>\n  <button type=\"button\" (click)=\"closed.emit()\" mat-icon-button>\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n<div class=\"body\"><ng-content></ng-content></div>\n","export const ANIMATION_LIST = [\n    'bounce',\n    'flash',\n    'pulse',\n    'rubberBand',\n    'shakeX',\n    'shakeY',\n    'headShake',\n    'swing',\n    'tada',\n    'wobble',\n    'jello',\n    'heartBeat',\n];\n","<div class=\"description\">\n  <div trans>Add an animation to draw attention to this link.</div>\n  <div trans>Selected animation will repeat five times by default.</div>\n</div>\n<div class=\"animation-list\">\n  <button\n    type=\"button\"\n    mat-stroked-button\n    [class.selected]=\"!(selectedAnimation$ | async)\"\n    (click)=\"selectAnimation(null)\"\n    trans\n  >\n    None\n  </button>\n  <button\n    type=\"button\"\n    mat-stroked-button\n    class=\"animate__animated\"\n    [class.selected]=\"(selectedAnimation$ | async) === animation\"\n    *ngFor=\"let animation of animationList\"\n    (mouseenter)=\"onMouseEnter($event, animation)\"\n    (mouseleave)=\"onMouseLeave($event, animation)\"\n    (click)=\"selectAnimation(animation)\"\n    trans\n  >\n    {{ animation }}\n  </button>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {ANIMATION_LIST} from './animation-list';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {LazyLoaderService} from '@common/core/utils/lazy-loader.service';\n\ntype propagateFn = (value: string) => void;\n\n@Component({\n    selector: 'animation-selector',\n    templateUrl: './animation-selector.component.html',\n    styleUrls: ['./animation-selector.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: AnimationSelectorComponent,\n            multi: true,\n        },\n    ],\n})\nexport class AnimationSelectorComponent\n    implements OnInit, ControlValueAccessor\n{\n    animationList = ANIMATION_LIST;\n    selectedAnimation$ = new BehaviorSubject<string>(null);\n    private propagateChange: propagateFn;\n\n    constructor(private lazyLoader: LazyLoaderService) {}\n\n    ngOnInit() {\n        this.lazyLoader.loadAsset(\n            'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css',\n            {type: 'css', id: 'animate.css'}\n        );\n    }\n\n    registerOnChange(fn: propagateFn) {\n        this.propagateChange = fn;\n    }\n\n    writeValue(value: string) {\n        this.selectedAnimation$.next(value);\n    }\n\n    registerOnTouched(fn: any) {}\n\n    selectAnimation(animation: string) {\n        this.propagateChange(animation);\n        this.selectedAnimation$.next(animation);\n    }\n\n    onMouseEnter(e: MouseEvent, animation: string) {\n        (e.target as HTMLElement).classList.add(`animate__${animation}`);\n    }\n\n    onMouseLeave(e: MouseEvent, animation: string) {\n        (e.target as HTMLElement).classList.remove(`animate__${animation}`);\n    }\n}\n","<div class=\"enable-panel\" *ngIf=\"!(leapIsActive$ | async)\">\n  <div trans>Temporarily send all visitors directly to this link.</div>\n  <div trans>You can only have one active Leap Link at a time.</div>\n  <button\n    type=\"button\"\n    mat-flat-button\n    color=\"accent\"\n    class=\"enable-leap-btn\"\n    (click)=\"enableLeapLink()\"\n    trans\n  >\n    Enable Leap Link\n  </button>\n</div>\n\n<div class=\"enable-panel\" *ngIf=\"leapIsActive$ | async\">\n  <div class=\"description\" trans>Set an end time for the Leap Link. Your Biolink will automatically restore when the Leap Link expires.</div>\n  <datetime-input [formControl]=\"leapUntilControl\"></datetime-input>\n  <button\n    type=\"button\"\n    mat-flat-button\n    color=\"accent\"\n    class=\"enable-leap-btn\"\n    (click)=\"disableLeapLink()\"\n    trans\n  >\n    Disable Leap Link\n  </button>\n</div>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n} from '@angular/core';\nimport {\n    ControlValueAccessor,\n    FormControl,\n    NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport {distinctUntilChanged, map, startWith} from 'rxjs/operators';\nimport {BehaviorSubject, Subscription} from 'rxjs';\n\ntype propagateFn = (date: string) => void;\n\n@Component({\n    selector: 'leap-link-panel',\n    templateUrl: './leap-link-panel.component.html',\n    styleUrls: ['./leap-link-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: LeapLinkPanelComponent,\n            multi: true,\n        },\n    ],\n})\nexport class LeapLinkPanelComponent\n    implements AfterViewInit, OnDestroy, ControlValueAccessor\n{\n    private propagateChange: propagateFn;\n    leapUntilControl = new FormControl(null);\n    leapIsActive$ = new BehaviorSubject<boolean>(false);\n    private sub: Subscription;\n\n    constructor() {\n        this.sub = this.leapUntilControl.valueChanges\n            .pipe(\n                startWith(null),\n                map(v => !!v)\n            )\n            .subscribe(v => {\n                this.leapIsActive$.next(v);\n            });\n    }\n\n    ngAfterViewInit() {\n        this.leapUntilControl.valueChanges\n            .pipe(distinctUntilChanged())\n            .subscribe(value => {\n                this.propagateChange(value);\n            });\n    }\n\n    ngOnDestroy() {\n        this.sub.unsubscribe();\n    }\n\n    registerOnChange(fn: propagateFn) {\n        this.propagateChange = fn;\n    }\n\n    writeValue(value: string) {\n        this.leapUntilControl.setValue(value);\n    }\n\n    registerOnTouched(fn: any) {}\n\n    enableLeapLink() {\n        const date = new Date();\n        date.setDate(date.getDate() + 1);\n        this.leapUntilControl.setValue(date.toISOString());\n    }\n\n    disableLeapLink() {\n        this.leapUntilControl.setValue(null);\n    }\n}\n","<div class=\"upload-panel\" *ngIf=\"!(src$ | async)\">\n  <div class=\"description\" trans>Upload a thumbnail for this link.</div>\n  <button\n    type=\"button\"\n    mat-flat-button\n    color=\"accent\"\n    class=\"action-button\"\n    (click)=\"openUploadWindow()\"\n    trans\n  >\n    Upload Thumbnail\n  </button>\n</div>\n\n<div class=\"change-panel\" *ngIf=\"src$ | async\">\n  <img [src]=\"src$ | async\" alt=\"\" class=\"preview\">\n  <div class=\"upload-buttons\">\n    <button\n      type=\"button\"\n      mat-flat-button\n      color=\"accent\"\n      class=\"action-button change-button\"\n      (click)=\"openUploadWindow()\"\n      trans\n    >\n      Change\n    </button>\n    <button\n      type=\"button\"\n      mat-stroked-button\n      color=\"accent\"\n      class=\"action-button\"\n      (click)=\"removeImage()\"\n      trans\n    >\n      Remove\n    </button>\n  </div>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {UploadInputTypes} from '@common/uploads/upload-input-config';\nimport {UploadUri} from '@common/uploads/types/upload-uri.enum';\nimport {AppearanceImageUploadValidator} from '@common/admin/appearance/appearance-image-input/appearance-image-upload-validator';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\n\ntype propagateFn = (url: string) => void;\n\n@Component({\n    selector: 'link-thumbnail-panel',\n    templateUrl: './link-thumbnail-panel.component.html',\n    styleUrls: ['./link-thumbnail-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [UploadQueueService,  {\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: LinkThumbnailPanelComponent,\n        multi: true,\n    },],\n})\nexport class LinkThumbnailPanelComponent implements OnInit, ControlValueAccessor {\n    src$ = new BehaviorSubject<string>(null);\n    private propagateChange: propagateFn;\n\n    constructor(\n        private uploadQueue: UploadQueueService,\n        private imageValidator: AppearanceImageUploadValidator,\n    ) {}\n\n    ngOnInit(): void {}\n\n    registerOnChange(fn: propagateFn) {\n        this.propagateChange = fn;\n    }\n\n    writeValue(value: string) {\n        this.src$.next(value);\n    }\n\n    registerOnTouched(fn: any) {}\n\n    openUploadWindow() {\n        openUploadWindow({\n            multiple: false,\n            types: [UploadInputTypes.image],\n        }).then(files => {\n            const config = {\n                httpParams: {diskPrefix: 'biolink-thumbnails'},\n                uri: UploadUri.Image,\n                validator: this.imageValidator,\n            };\n            this.uploadQueue.start(files, config).subscribe(response => {\n                this.src$.next(response.fileEntry.url);\n                this.propagateChange(response.fileEntry.url);\n            });\n        });\n    }\n\n    removeImage() {\n        this.src$.next(null);\n        this.propagateChange(null);\n    }\n}\n","<ng-container [formGroup]=\"form\">\n  <div\n    class=\"content-item-wrapper\"\n    [class.slide-out-panel-active]=\"activeSlideOutPanel$ | async\"\n    [class.active-locked]=\"link.active_locked\"\n  >\n    <div class=\"drag-handle-container\">\n      <button type=\"button\" mat-icon-button cdkDragHandle>\n        <mat-icon svgIcon=\"drag-indicator\"></mat-icon>\n      </button>\n    </div>\n    <div class=\"content-item-body\">\n      <div class=\"header\">\n        <div class=\"title\">{{ link.name }}</div>\n        <mat-slide-toggle formControlName=\"active\"></mat-slide-toggle>\n      </div>\n      <div class=\"subheader\">\n        <img class=\"favicon-img\" [src]=\"link.image\" *ngIf=\"link.image\" alt=\"\" />\n        <img class=\"favicon-img\" [src]=\"link.long_url | favicon\" *ngIf=\"!link.image\" alt=\"\" />\n        <span class=\"url\">{{ link.long_url }}</span>\n      </div>\n      <div class=\"actions\">\n        <button\n          type=\"button\"\n          (click)=\"openEditLinkDialog()\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button\"\n          [matTooltip]=\"'Edit' | trans\"\n          mat-icon-button\n        >\n          <mat-icon svgIcon=\"edit\"></mat-icon>\n        </button>\n        <button\n          type=\"button\"\n          (click)=\"toggleAnimationPanel('image')\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button image-action-btn\"\n          mat-icon-button\n          [matTooltip]=\"'Change Thumbnail' | trans\"\n          [class.active]=\"imageActive$ | async\"\n        >\n          <mat-icon svgIcon=\"image\"></mat-icon>\n        </button>\n        <a\n          [routerLink]=\"['/', getParentRoute(), 'links', link.id]\"\n          target=\"_blank\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button\"\n          mat-icon-button\n          [matTooltip]=\"'Statistics' | trans\"\n        >\n          <mat-icon svgIcon=\"analytics\"></mat-icon>\n        </a>\n        <button\n          type=\"button\"\n          [disabled]=\"editor.loading$ | async\"\n          (click)=\"toggleAnimationPanel('animation')\"\n          class=\"action-button\"\n          mat-icon-button\n          [matTooltip]=\"'Animation' | trans\"\n          [class.active]=\"animationActive$ | async\"\n        >\n          <mat-icon svgIcon=\"animation\"></mat-icon>\n        </button>\n        <button\n          type=\"button\"\n          (click)=\"toggleAnimationPanel('leapLink')\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button\"\n          mat-icon-button\n          [matTooltip]=\"'Leap Link' | trans\"\n          [class.active]=\"leapActive$ | async\"\n        >\n          <mat-icon svgIcon=\"shortcut\"></mat-icon>\n        </button>\n        <button\n          type=\"button\"\n          (click)=\"toggleAnimationPanel('schedule')\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button schedule-action-btn\"\n          mat-icon-button\n          [matTooltip]=\"'Schedule' | trans\"\n          [class.active]=\"scheduleActive$ | async\"\n        >\n          <mat-icon svgIcon=\"more-time\"></mat-icon>\n        </button>\n        <button\n          type=\"button\"\n          (click)=\"editor.maybeDeleteContentItem(link)\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button delete-action\"\n          mat-icon-button\n        >\n          <mat-icon svgIcon=\"delete\"></mat-icon>\n        </button>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"locked-notif\" *ngIf=\"link.active_locked && !(activeSlideOutPanel$ | async)\">\n    <div class=\"locked-notif-msg\" trans>This link is inactive due to its schedule.</div>\n  </div>\n\n  <biolink-slideout-panel\n    [title]=\"'Animation'\"\n    (closed)=\"activeSlideOutPanel$.next(null)\"\n    *ngIf=\"(activeSlideOutPanel$ | async) === 'animation'\"\n    @slideOutPanelAnimation\n  >\n    <animation-selector formControlName=\"animation\"></animation-selector>\n  </biolink-slideout-panel>\n\n  <biolink-slideout-panel\n    [title]=\"'Leap Link'\"\n    (closed)=\"activeSlideOutPanel$.next(null)\"\n    *ngIf=\"(activeSlideOutPanel$ | async) === 'leapLink'\"\n    @slideOutPanelAnimation\n  >\n    <leap-link-panel formControlName=\"image\"></leap-link-panel>\n  </biolink-slideout-panel>\n\n  <biolink-slideout-panel\n    title=\"Thumbnail\"\n    (closed)=\"activeSlideOutPanel$.next(null)\"\n    *ngIf=\"(activeSlideOutPanel$ | async) === 'image'\"\n    @slideOutPanelAnimation\n  >\n    <link-thumbnail-panel formControlName=\"image\"></link-thumbnail-panel>\n  </biolink-slideout-panel>\n\n  <biolink-slideout-panel\n    title=\"Schedule Link\"\n    (closed)=\"activeSlideOutPanel$.next(null)\"\n    *ngIf=\"(activeSlideOutPanel$ | async) === 'schedule'\"\n    @slideOutPanelAnimation\n  >\n    <p [transValues]=\"{resource: 'link'}\" class=\"schedule-description\" trans>\n      Enter a date when :resource should be active. Both start and end dates are optional.\n    </p>\n    <div class=\"inline-inputs-container\">\n      <div class=\"input-container\" permission-aware-input-container=\"expiration\">\n        <datetime-input id=\"bio_exp_at\" formControlName=\"activates_at\" trans\n          >Start Date</datetime-input\n        >\n      </div>\n      <div class=\"input-container\" permission-aware-input-container=\"expiration\">\n        <datetime-input id=\"bio_act_at\" formControlName=\"expires_at\">End Date</datetime-input>\n      </div>\n    </div>\n  </biolink-slideout-panel>\n</ng-container>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Input,\n    OnChanges,\n    OnInit,\n} from '@angular/core';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\nimport {FormBuilder} from '@angular/forms';\nimport {BehaviorSubject, combineLatest, Observable, Subscription} from 'rxjs';\nimport {ActiveAppSectionService} from '../../../../active-app-section.service';\nimport {animate, style, transition, trigger} from '@angular/animations';\nimport {debounceTime, map, startWith} from 'rxjs/operators';\nimport {BiolinkLink} from '../../biolink-link';\n\n@Component({\n    selector: 'biolink-editor-link',\n    templateUrl: './biolink-editor-link.component.html',\n    styleUrls: ['./biolink-editor-link.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: [\n        trigger('slideOutPanelAnimation', [\n            transition(':enter', [\n                style({height: '0px', opacity: 0}),\n                animate(\n                    '225ms cubic-bezier(0.4,0.0,0.2,1)',\n                    style({height: '*', opacity: 1})\n                ),\n            ]),\n            transition(':leave', [\n                style({height: '*', opacity: 1}),\n                animate(\n                    '225ms cubic-bezier(0.4,0.0,0.2,1)',\n                    style({height: '0px', opacity: 0})\n                ),\n            ]),\n        ]),\n    ],\n})\nexport class BiolinkEditorLinkComponent implements OnInit, OnChanges {\n    @Input() link: BiolinkLink;\n    activeSlideOutPanel$ = new BehaviorSubject<string>(null);\n\n    form = this.fb.group({\n        active: true,\n        animation: null,\n        leap_until: null,\n        image: null,\n        expires_at: null,\n        activates_at: null,\n    });\n    leapActive$: Observable<boolean>;\n    animationActive$: Observable<boolean>;\n    imageActive$: Observable<boolean>;\n    scheduleActive$: Observable<boolean>;\n    private formSub: Subscription;\n    private animSub: Subscription;\n\n    constructor(\n        public editor: BiolinkEditorService,\n        private fb: FormBuilder,\n        private section: ActiveAppSectionService\n    ) {}\n\n    // need to update form in \"ngOnChanges\" as disabled attribute\n    // might change in backend when biolink is reloaded\n    ngOnChanges() {\n        this.formSub?.unsubscribe();\n        this.animSub?.unsubscribe();\n        this.form.patchValue(this.link);\n\n        if (this.link.active_locked) {\n            this.form.get('active').disable();\n        } else {\n            this.form.get('active').enable();\n        }\n\n        // need to remove old sub and resubscribe so there's no infinite loops\n        this.formSub = this.form.valueChanges\n            .pipe(debounceTime(400))\n            .subscribe(() => {\n                this.editor.updateContentItemConfig(\n                    this.link,\n                    this.getDirtyFromValues()\n                );\n            });\n\n        this.animSub = this.form.get('animation').valueChanges.subscribe(() => {\n            this.activeSlideOutPanel$.next(null);\n        });\n    }\n\n    ngOnInit() {\n        this.leapActive$ = this.activeObservable('leap_until');\n        this.animationActive$ = this.activeObservable('animation');\n        this.imageActive$ = this.activeObservable('image');\n        this.scheduleActive$ = combineLatest(\n            this.activeObservable('expires_at'),\n            this.activeObservable('activates_at')\n        ).pipe(map(v => v[0] || v[1]));\n    }\n\n    toggleAnimationPanel(name: string) {\n        const current = this.activeSlideOutPanel$.value;\n        if (current === name) {\n            this.activeSlideOutPanel$.next(null);\n        } else {\n            this.activeSlideOutPanel$.next(name);\n        }\n    }\n\n    openEditLinkDialog() {\n        this.editor.openCrupdateLinkDialog(this.link);\n    }\n\n    getParentRoute(): string {\n        return this.section.admin ? 'admin' : 'dashboard';\n    }\n\n    enableLeapLink() {\n        this.form.patchValue({\n            leap_link: true,\n        });\n    }\n\n    clearFormField(fieldName: string) {\n        this.form.patchValue({[fieldName]: null});\n    }\n\n    private activeObservable(name: string) {\n        return this.form.get(name).valueChanges.pipe(\n            startWith(this.link[name]),\n            map(v => !!v)\n        );\n    }\n\n    private getDirtyFromValues() {\n        const dirtyValues = {};\n        Object.entries(this.form.controls).forEach(([name, control]) => {\n            if (control.dirty) {\n                dirtyValues[name] = control.value;\n            }\n        });\n        return dirtyValues;\n    }\n}\n","<ng-container [formGroup]=\"form\">\n  <div class=\"content-item-wrapper\">\n    <div class=\"drag-handle-container\">\n      <button type=\"button\" mat-icon-button cdkDragHandle>\n        <mat-icon svgIcon=\"drag-indicator\"></mat-icon>\n      </button>\n    </div>\n    <div class=\"content-item-body\" *ngIf=\"getWidgetConfig(widget.type) as config\">\n      <ng-container [ngSwitch]=\"config.type\">\n        <ng-container *ngSwitchCase=\"'image'\">\n          <div class=\"header\">\n            <div class=\"title image-title\">\n              <image-or-icon class=\"inherit-size\" [src]=\"widget.config.url\"></image-or-icon>\n              <div class=\"capitalize\" trans>{{ config.name || config.type }}</div>\n            </div>\n            <mat-slide-toggle formControlName=\"active\"></mat-slide-toggle>\n          </div>\n        </ng-container>\n        <ng-container *ngSwitchCase=\"'text'\">\n          <div class=\"header\">\n            <div class=\"title\">\n              <div class=\"capitalize centered\" trans>{{ config.name || config.type }}</div>\n              <div class=\"text-widget-body\">\n                <div class=\"text-widget-title centered\">{{ widget.config.title }}</div>\n                <div class=\"text-widget-description centered\">{{ widget.config.description }}</div>\n              </div>\n            </div>\n            <mat-slide-toggle formControlName=\"active\"></mat-slide-toggle>\n          </div>\n        </ng-container>\n        <ng-container *ngSwitchCase=\"'socials'\">\n          <div class=\"header\">\n            <div class=\"title capitalize\" trans>{{ config.name || config.type }}</div>\n            <mat-slide-toggle formControlName=\"active\"></mat-slide-toggle>\n          </div>\n          <div class=\"subheader\">\n            <social-button-list [config]=\"widget.config\"></social-button-list>\n          </div>\n        </ng-container>\n        <ng-container *ngSwitchDefault>\n          <div class=\"header\">\n            <div class=\"title capitalize\" trans>{{ config.name || config.type }}</div>\n            <mat-slide-toggle formControlName=\"active\"></mat-slide-toggle>\n          </div>\n          <div class=\"subheader\">\n            <img\n              class=\"favicon-img\"\n              [src]=\"settings.getAssetUrl('images/widgets/' + config.image)\"\n              alt=\"\"\n            />\n            <span class=\"url\">{{ widget.config.url }}</span>\n          </div>\n        </ng-container>\n      </ng-container>\n      <div class=\"actions\">\n        <button\n          type=\"button\"\n          (click)=\"openEditWidgetDialog(widget)\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button\"\n          mat-icon-button\n          [matTooltip]=\"'Edit' | trans\"\n        >\n          <mat-icon svgIcon=\"edit\"></mat-icon>\n        </button>\n        <button\n          type=\"button\"\n          (click)=\"editor.maybeDeleteContentItem(widget)\"\n          [disabled]=\"editor.loading$ | async\"\n          class=\"action-button delete-action\"\n          mat-icon-button\n        >\n          <mat-icon svgIcon=\"delete\"></mat-icon>\n        </button>\n      </div>\n    </div>\n  </div>\n</ng-container>\n","import {ChangeDetectionStrategy, Component, Input, OnInit} from '@angular/core';\nimport {WIDGET_LIST} from '../../widgets/widget-list';\nimport {BiolinkWidget} from '../../widgets/biolink-widget';\nimport {Settings} from '@common/core/config/settings.service';\nimport {FormBuilder} from '@angular/forms';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {CrupdateWidgetDialogData} from '../../widgets/text-widget-modal/text-widget-modal.component';\n\n@Component({\n    selector: 'biolink-editor-widget',\n    templateUrl: './biolink-editor-widget.component.html',\n    styleUrls: ['./biolink-editor-widget.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BiolinkEditorWidgetComponent implements OnInit {\n    @Input() widget: BiolinkWidget;\n\n    form = this.fb.group({\n        active: true,\n    });\n\n    constructor(\n        public settings: Settings,\n        private fb: FormBuilder,\n        public editor: BiolinkEditorService,\n        private modal: Modal\n    ) {}\n\n    ngOnInit() {\n        this.form.patchValue(this.widget);\n\n        this.form.valueChanges.subscribe(value => {\n            this.editor.updateContentItemConfig(this.widget, value);\n        });\n    }\n\n    getWidgetConfig(type: string) {\n        return WIDGET_LIST.find(w => w.type === type);\n    }\n\n    openEditWidgetDialog(widget: BiolinkWidget) {\n        const listItem = this.getWidgetConfig(widget.type);\n        this.modal.open(listItem.component, {\n            config: widget.config,\n            widgetId: widget.id,\n        } as CrupdateWidgetDialogData);\n    }\n}\n","<div class=\"links-tab left-col-spacer\">\n  <button\n    type=\"button\"\n    mat-raised-button\n    color=\"accent\"\n    class=\"add-new-link-btn\"\n    (click)=\"openNewLinkDialog()\"\n    trans\n  >\n    Add New Link\n  </button>\n  <button\n    type=\"button\"\n    mat-raised-button\n    color=\"accent\"\n    class=\"add-widget-btn\"\n    (click)=\"openWidgetListDialog()\"\n    [matTooltip]=\"'Add widget' | trans\"\n  >\n    <mat-icon svgIcon=\"widgets\"></mat-icon>\n  </button>\n\n  <ng-container *ngIf=\"editor.biolink$ | async as biolink; else loading\">\n    <div\n      class=\"link-list\"\n      cdkDropList\n      [cdkDropListDisabled]=\"editor.loading$ | async\"\n      (cdkDropListDropped)=\"reorderContent($event)\"\n      @fadeIn\n    >\n      <ng-container  *ngFor=\"let contentItem of biolink.content; trackBy: trackByFn\">\n        <biolink-editor-link\n          class=\"biolink-content-item\"\n          [link]=\"contentItem\"\n          *ngIf=\"contentItem.model_type === 'link'\"\n          cdkDrag\n        ></biolink-editor-link>\n        <biolink-editor-widget\n          class=\"biolink-content-item\"\n          [widget]=\"contentItem\"\n          *ngIf=\"contentItem.model_type === 'biolinkWidget'\"\n          cdkDrag\n        ></biolink-editor-widget>\n      </ng-container>\n\n      <no-results-message svgImage=\"share-link.svg\" *ngIf=\"!biolink.content.length\">\n        <span primary-text trans>No links or widgets have been added yet</span>\n      </no-results-message>\n    </div>\n  </ng-container>\n  <ng-template #loading>\n    <div class=\"link-list\" @fadeOut>\n      <div class=\"biolink-content-item\" *ngFor=\"let s of skeletonIterator\">\n        <div class=\"content-item-wrapper\">\n          <div class=\"drag-handle-container\">\n            <skeleton variant=\"icon\"></skeleton>\n          </div>\n          <div class=\"content-item-body\">\n            <skeleton animation></skeleton>\n            <skeleton></skeleton>\n            <skeleton></skeleton>\n          </div>\n        </div>\n      </div>\n    </div>\n  </ng-template>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {WidgetListModalComponent} from '../widgets/widget-list-modal/widget-list-modal.component';\nimport {finalize} from 'rxjs/operators';\nimport {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {BiolinkEditorService} from '../biolink-editor.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {BiolinksService} from '../../biolinks.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {SKELETON_ANIMATIONS} from '@common/core/ui/skeleton/skeleton-animations';\nimport {BiolinkLink} from '../biolink-link';\nimport {BiolinkWidget} from '../widgets/biolink-widget';\n\n@Component({\n    selector: 'biolink-editor-content',\n    templateUrl: './biolink-editor-content.component.html',\n    styleUrls: ['./biolink-editor-content.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: SKELETON_ANIMATIONS,\n})\nexport class BiolinkEditorContentComponent {\n    skeletonIterator = Array(5);\n    trackByFn = (i: number, item: BiolinkLink | BiolinkWidget) => item.id;\n\n    constructor(\n        private modal: Modal,\n        public editor: BiolinkEditorService,\n        private toast: Toast,\n        private biolinks: BiolinksService,\n        public settings: Settings\n    ) {}\n\n    openNewLinkDialog() {\n        this.editor.openCrupdateLinkDialog(null, {\n            createMsg: 'Link added',\n        });\n    }\n\n    openWidgetListDialog() {\n        this.modal.open(WidgetListModalComponent, {\n            biolinkId: this.editor.biolink$.value.id,\n        });\n    }\n\n    reorderContent(e: CdkDragDrop<any>) {\n        if (e.previousIndex === e.currentIndex) return;\n        const newContent = [...this.editor.biolink$.value.content];\n        moveItemInArray(newContent, e.previousIndex, e.currentIndex);\n        this.editor.biolink$.next({\n            ...this.editor.biolink$.value,\n            content: newContent,\n        });\n\n        const payload = newContent.map(c => {\n            return {id: c.id, model_type: c.model_type};\n        });\n\n        this.editor.loading$.next(true);\n        this.biolinks\n            .changeOrder(this.editor.biolink$.value.id, payload)\n            .pipe(finalize(() => this.editor.loading$.next(false)))\n            .subscribe();\n    }\n}\n","export interface BackgroundConfig {\n    configId: string;\n    backgroundColor?: string;\n    backgroundAttachment?: string;\n    backgroundSize?: string;\n    backgroundRepeat?: string;\n    backgroundPosition?: string;\n    backgroundImage?: string;\n    color?: string;\n    configLabel?: string;\n}\n\nexport const uploadedImgBg = {\n    configId: 'uploadedImg',\n    configLabel: 'Image',\n    backgroundSize: 'cover',\n    repeat: 'no-repeat',\n    position: 'center center',\n};\n\nexport const flatColorBg = {\n    configId: 'flat',\n    configLabel: 'Color',\n    backgroundColor: 'rgb(209, 246, 255)',\n    color: null,\n};\n\nexport const gradientBg = {\n    configId: 'gradient',\n    configLabel: 'Gradient',\n    backgroundImage: 'linear-gradient(43deg, #4158D0 0%, #C850C0 46%, #FFCC70 100%)'\n};\n\nexport const BACKGROUND_LIST: BackgroundConfig[] = [\n    uploadedImgBg,\n    flatColorBg,\n    gradientBg,\n    {\n        configId: 'img1',\n        backgroundColor: '#ffdd55',\n        backgroundImage: 'svg-bgs/Angled-Focus.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img2',\n        backgroundColor: '#220044',\n        backgroundImage: 'svg-bgs/Circular-Focus.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img3',\n        backgroundColor: '#000000',\n        backgroundImage: 'svg-bgs/Farseeing-Eyeball.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img4',\n        backgroundColor: '#ff0000',\n        backgroundImage: 'svg-bgs/Canyon-Funnel.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img5',\n        backgroundColor: '#11ddaa',\n        backgroundImage: 'svg-bgs/Looney-Loops.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#000',\n    },\n    {\n        configId: 'img6',\n        backgroundColor: '#070014',\n        backgroundImage: 'svg-bgs/Hurricane-Aperture.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img7',\n        backgroundColor: '#ccffff',\n        backgroundImage: 'svg-bgs/Icy-Explosion.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        backgroundRepeat: 'no-repeat',\n        color: '#000',\n    },\n    {\n        configId: 'img8',\n        backgroundColor: '#442233',\n        backgroundImage: 'svg-bgs/Nuclear-Focalpoint.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img9',\n        backgroundColor: '#ee5522;',\n        backgroundImage: 'svg-bgs/Protruding-Squares.svg',\n        color: '#fff',\n    },\n    {\n        configId: 'img10',\n        backgroundColor: '#fff',\n        backgroundImage: 'svg-bgs/Alternating-Triangles.svg',\n        color: '#000',\n    },\n    {\n        configId: 'img11',\n        backgroundColor: '#002200',\n        backgroundImage: 'svg-bgs/Monstera-Patch.svg',\n        color: '#fff',\n    },\n    {\n        configId: 'img11',\n        backgroundColor: '#aa3333',\n        backgroundImage: 'svg-bgs/Confetti-Doodles.svg',\n        color: '#fff',\n        backgroundAttachment: 'fixed',\n    },\n    {\n        configId: 'img12',\n        backgroundColor: '#ffdd99',\n        backgroundImage: 'svg-bgs/Threads-Ahead.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#000',\n    },\n    {\n        configId: 'img13',\n        backgroundColor: '#00bbff',\n        backgroundImage: 'svg-bgs/Launch-Day.svg',\n        backgroundAttachment: 'fixed',\n        backgroundSize: 'cover',\n        color: '#fff',\n    },\n    {\n        configId: 'img14',\n        backgroundImage: 'svg-bgs/Sprinkle.svg',\n    },\n    {\n        configId: 'img15',\n        backgroundImage: 'svg-bgs/Circuit-Board.svg',\n    },\n    {\n        configId: 'img15',\n        backgroundImage: 'svg-bgs/Snow.svg',\n    },\n];\n","import { BackgroundConfig } from '@common/shared/form-controls/background-selector/background-list';\n\nexport const GRADIENT_LIST: BackgroundConfig[] = [\n  {\n    configId: 'grd1',\n    backgroundImage: 'linear-gradient(45deg, #ff9a9e 0%, #fad0c4 99%, #fad0c4 100%)',\n  },\n  {\n    configId: 'grd2',\n    backgroundImage: 'linear-gradient(to right, #ff8177 0%, #ff867a 0%, #ff8c7f 21%, #f99185 52%, #cf556c 78%, #b12a5b 100%)',\n  },\n  {\n    configId: 'grd3',\n    backgroundImage: 'linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%)',\n  },\n  {\n    configId: 'grd4',\n    backgroundImage: 'linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%)',\n  },\n  {\n    configId: 'grd5',\n    backgroundImage: 'linear-gradient(to top, #30cfd0 0%, #330867 100%)',\n    color: '#fff',\n  },\n  {\n    configId: 'grd6',\n    backgroundImage: 'linear-gradient(135deg, #FDEB71 10%, #F8D800 100%)',\n  },\n  {\n    configId: 'grd7',\n    backgroundImage: 'linear-gradient( 135deg, #F05F57 10%, #360940 100%)',\n  },\n  {\n    configId: 'grd8',\n    color: '#4158D0',\n    backgroundImage: 'linear-gradient(43deg, #4158D0 0%, #C850C0 46%, #FFCC70 100%)',\n\n  },\n  {\n    configId: 'grd9',\n    color: '#FBAB7E',\n    backgroundImage: 'linear-gradient(62deg, #FBAB7E 0%, #F7CE68 100%)',\n  },\n  {\n    configId: 'grd10',\n    color: '#21D4FD',\n    backgroundImage: 'linear-gradient(19deg, #21D4FD 0%, #B721FF 100%)',\n  },\n  {\n    configId: 'grd11',\n    backgroundImage: 'linear-gradient( 109.5deg,  rgba(76,221,242,1) 11.2%, rgba(92,121,255,1) 91.1% )',\n  },\n  {\n    configId: 'grd12',\n    backgroundImage: 'linear-gradient( 112.1deg,  rgba(32,38,57,1) 11.4%, rgba(63,76,119,1) 70.2% )',\n    color: '#fff',\n  }\n];\n","<div class=\"auto-height-grid\">\n  <div\n    class=\"grid-item\"\n    [class.active]=\"data.active?.configId === gradient.configId\"\n    *ngFor=\"let gradient of gradients\"\n    (click)=\"selectGradient(gradient)\"\n  >\n    <div class=\"grid-content\" [style.background-image]=\"gradient.backgroundImage\"></div>\n    <div class=\"grid-label\"></div>\n  </div>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    Optional,\n} from '@angular/core';\nimport {GRADIENT_LIST} from '@common/shared/form-controls/background-selector/background-selector-gradient/gradient-list';\nimport {OVERLAY_PANEL_DATA} from '@common/core/ui/overlay-panel/overlay-panel-data';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {BackgroundConfig} from '@common/shared/form-controls/background-selector/background-list';\n\n@Component({\n    selector: 'background-selector-gradient',\n    templateUrl: './background-selector-gradient.component.html',\n    styleUrls: ['./background-selector-gradient.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BackgroundSelectorGradientComponent {\n    gradients = GRADIENT_LIST;\n\n    constructor(\n        @Inject(OVERLAY_PANEL_DATA)\n        @Optional()\n        public data: {active?: BackgroundConfig},\n        private overlayPanelRef: OverlayPanelRef\n    ) {}\n\n    selectGradient(gradient: BackgroundConfig) {\n        this.overlayPanelRef.close(gradient);\n    }\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    HostListener,\n    Output,\n    EventEmitter,\n    Input,\n    OnChanges,\n} from '@angular/core';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {UploadInputTypes} from '@common/uploads/upload-input-config';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {AppearanceImageUploadValidator} from '@common/admin/appearance/appearance-image-input/appearance-image-upload-validator';\nimport {BackgroundUrlPipe} from '@common/core/ui/format-pipes/background-url.pipe';\nimport {\n    BackgroundConfig,\n    uploadedImgBg,\n} from '@common/shared/form-controls/background-selector/background-list';\n\n@Component({\n    selector: 'background-selector-img',\n    templateUrl: './background-selector-img.component.html',\n    styleUrls: ['./background-selector-img.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BackgroundSelectorImgComponent implements OnChanges {\n    @Output() imgUploaded = new EventEmitter<BackgroundConfig>();\n    @Input() selectedBg: BackgroundConfig;\n\n    ngOnChanges() {\n        this.el.nativeElement.style.backgroundImage =\n            this.selectedBg && this.selectedBg.configId === 'uploadedImg'\n                ? this.bgUrl.transform(this.selectedBg.backgroundImage)\n                : null;\n    }\n\n    constructor(\n        private uploadQueue: UploadQueueService,\n        private imgValidator: AppearanceImageUploadValidator,\n        private el: ElementRef<HTMLElement>,\n        private bgUrl: BackgroundUrlPipe\n    ) {}\n\n    @HostListener('click', ['$event.target'])\n    openUploadDialog() {\n        openUploadWindow({\n            types: [UploadInputTypes.image],\n        }).then(files => {\n            this.uploadQueue\n                .start(files, {\n                    validator: this.imgValidator,\n                    httpParams: {diskPrefix: 'biolink', disk: 'public'},\n                })\n                .subscribe(response => {\n                    this.imgUploaded.emit({\n                        ...uploadedImgBg,\n                        backgroundImage: response.fileEntry.url,\n                    });\n                });\n        });\n    }\n}\n","<div class=\"icon-container\">\n  <mat-icon svgIcon=\"add-photo-alternate\"></mat-icon>\n</div>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'labelFromFilename'\n})\nexport class LabelFromFilenamePipe implements PipeTransform {\n\n  transform(value: string): string {\n    if (value) {\n        return value.split('/').pop().split('.')[0].replace('-', ' ');\n    }\n  }\n}\n","<div class=\"auto-height-grid\">\n    <ng-container *ngFor=\"let item of backgrounds\">\n        <div>\n            <div class=\"grid-item\" [class.active]=\"(selectedBg$ | async)?.id === item.configId\">\n                <ng-container [ngSwitch]=\"item.configId\">\n                    <background-selector-img\n                        class=\"grid-content\"\n                        matRipple\n                        *ngSwitchCase=\"'uploadedImg'\"\n                        (imgUploaded)=\"selectBackground($event)\"\n                        [selectedBg]=\"selectedBg$ | async\"\n                    ></background-selector-img>\n                    <div\n                        *ngSwitchDefault\n                        class=\"grid-content\"\n                        matRipple\n                        [style.background-color]=\"item.color\"\n                        [style.background-image]=\"item.backgroundImage | backgroundUrl\"\n                        (click)=\"onBgClick(item, $event)\"\n                    ></div>\n                </ng-container>\n            </div>\n            <div class=\"grid-label\">\n                {{ item.configLabel || (item.backgroundImage | labelFromFilename) | trans }}\n            </div>\n        </div>\n    </ng-container>\n</div>\n","import {ChangeDetectionStrategy, Component, ElementRef, Input} from '@angular/core';\nimport {\n    BACKGROUND_LIST,\n    BackgroundConfig,\n    flatColorBg,\n} from '@common/shared/form-controls/background-selector/background-list';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\nimport {takeUntil} from 'rxjs/operators';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {BackgroundSelectorGradientComponent} from '@common/shared/form-controls/background-selector/background-selector-gradient/background-selector-gradient.component';\n\ntype propagateFn = (value: BackgroundConfig) => void;\n\n@Component({\n    selector: 'background-selector',\n    templateUrl: './background-selector.component.html',\n    styleUrls: ['./background-selector.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: BackgroundSelectorComponent,\n            multi: true,\n        },\n    ],\n})\nexport class BackgroundSelectorComponent implements ControlValueAccessor {\n    backgrounds = BACKGROUND_LIST;\n    selectedBg$ = new BehaviorSubject<BackgroundConfig>(null);\n    private propagateChange: propagateFn;\n\n    constructor(private overlay: OverlayPanel) {}\n\n    registerOnChange(fn: propagateFn) {\n        this.propagateChange = fn;\n    }\n\n    writeValue(value: BackgroundConfig) {\n        this.selectedBg$.next(value);\n    }\n\n    registerOnTouched(fn: any) {}\n\n    onBgClick(bg: BackgroundConfig, e: MouseEvent) {\n        if (bg.configId === 'flat') {\n            this.setFlatColorBg(this.selectedBg$.value?.color);\n            this.openColorPicker(e);\n        } else if (bg.configId === 'gradient') {\n            this.overlay\n                .open(BackgroundSelectorGradientComponent, {\n                    origin: new ElementRef(e.target),\n                    position: RIGHT_POSITION,\n                    data: {active: this.selectedBg$.value},\n                })\n                .afterClosed()\n                .subscribe(value => {\n                    if (value) {\n                        this.selectBackground(value);\n                    }\n                });\n        } else {\n            this.selectBackground(bg);\n        }\n    }\n\n    selectBackground(bg: BackgroundConfig) {\n        // keep background color from \"simple color\" if\n        // it's not specified explicitly for this background\n        const oldColor = this.selectedBg$.value?.color;\n        const newBg = {...bg};\n        if ( ! newBg.color && oldColor) {\n            newBg.color = oldColor;\n        }\n        this.propagateChange(newBg);\n        this.selectedBg$.next(newBg);\n    }\n\n    private setFlatColorBg(color: string) {\n        this.selectBackground({\n            ...flatColorBg,\n            color,\n        });\n    }\n\n    private async openColorPicker(e: MouseEvent) {\n        const {BeColorPickerModule} = await import(\n            '@common/core/ui/color-picker/be-color-picker.module'\n        );\n\n        const overlayRef = this.overlay.open(\n            BeColorPickerModule.components.panel,\n            {\n                origin: new ElementRef(e.target),\n                position: RIGHT_POSITION,\n                data: {color: this.selectedBg$.value?.color},\n            }\n        );\n\n        overlayRef\n            .valueChanged()\n            .pipe(takeUntil(overlayRef.afterClosed()))\n            .subscribe(color => {\n                this.setFlatColorBg(color);\n            });\n    }\n}\n","import {FontConfig} from '@common/core/services/value-lists.service';\n\nexport const BROWSER_SAFE_FONTS: FontConfig[] = [\n    {family: 'Impact, Charcoal, sans-serif', category: 'sans-serif'},\n    {family: 'Arial, Helvetica Neue, Helvetica, sans-serif', category: 'serif'},\n    {family: '\"Comic Sans MS\", cursive, sans-serif', category: 'Handwriting'},\n    {family: 'Century Gothic, sans-serif', category: 'sans-serif'},\n    {family: '\"Courier New\", Courier, monospace', category: 'monospace'},\n    {family: '\"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif', category: 'sans-serif'},\n    {family: '\"Times New Roman\", Times, serif', category: 'serif'},\n    {family: '\"Lucida Console\", Monaco, monospace', category: 'monospace'},\n    {family: '\"Andele Mono\", monospace, sans-serif', category: 'sans-serif'},\n    {family: 'Verdana, Geneva, sans-serif', category: 'sans-serif'},\n    {family: '\"Helvetica Neue\", Helvetica, Arial, sans-serif', category: 'sans-serif'},\n];\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n    name: 'fontDisplayName',\n})\nexport class FontDisplayNamePipe implements PipeTransform {\n    transform(fontFamily: string): string {\n        if (!fontFamily) {\n            return null;\n        }\n        return fontFamily.split(',')[0].replace(/\"/g, '').trim();\n    }\n}\n","<form class=\"filters inline-inputs-container many-inputs\" [formGroup]=\"filters\">\n  <div class=\"input-container\">\n    <label for=\"font-selector-search\" class=\"hidden\" trans>Search</label>\n    <input type=\"text\" id=\"font-selector-search\" formControlName=\"query\" placeholder=\"Search...\" />\n  </div>\n  <div class=\"input-container\">\n    <label for=\"font-selector-category\" class=\"hidden\" trans>Category</label>\n    <select id=\"font-selector-category\" formControlName=\"category\">\n      <option [ngValue]=\"null\" trans>All Categories</option>\n      <option value=\"serif\" trans>Serif</option>\n      <option value=\"sans-serif\" trans>Sans Serif</option>\n      <option value=\"display\" trans>Display</option>\n      <option value=\"handwriting\" trans>Handwriting</option>\n      <option value=\"monospace\" trans>monospace</option>\n    </select>\n  </div>\n</form>\n\n<div class=\"font-grid\">\n  <div\n    class=\"font\"\n    *ngFor=\"let font of fonts$ | async\"\n    (click)=\"selectFamily(font.family)\"\n    [class.active]=\"(selectedFamily$ | async) === font.family\"\n  >\n    <div class=\"grid-item\" role=\"button\" matRipple>\n      <div class=\"grid-content\">\n        <svg viewBox=\"0 0 100 100\">\n          <text x=\"50%\" y=\"50%\" [style.fontFamily]=\"font.family\">Aa</text>\n        </svg>\n      </div>\n    </div>\n    <div class=\"label\">{{ font.family | fontDisplayName }}</div>\n  </div>\n</div>\n\n<div class=\"range-actions\">\n  <div class=\"range-label\">\n    {{ from$ | async }} - {{ to$ | async }} {{ 'of' | trans }} {{ total$ | async | number }}\n  </div>\n  <button\n    type=\"button\"\n    [disabled]=\"!havePrev()\"\n    class=\"range-button\"\n    (click)=\"prevPage()\"\n    mat-icon-button\n  >\n    <mat-icon svgIcon=\"chevron-left\"></mat-icon>\n  </button>\n  <button\n    type=\"button\"\n    [disabled]=\"!haveNext()\"\n    class=\"range-button\"\n    (click)=\"nextPage()\"\n    mat-icon-button\n  >\n    <mat-icon svgIcon=\"chevron-right\"></mat-icon>\n  </button>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {FontConfig} from '@common/core/services/value-lists.service';\nimport {BehaviorSubject, combineLatest, Observable, Subscription} from 'rxjs';\nimport {map} from 'rxjs/operators';\nimport {\n    ControlValueAccessor,\n    FormControl,\n    FormGroup,\n    NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport {filterDatatableData} from '@common/datatable/utils/filter-datatable-data';\nimport {GoogleFontService} from '@common/shared/form-controls/google-font-selector/google-font.service';\nimport {BROWSER_SAFE_FONTS} from '@common/shared/form-controls/google-font-selector/browser-safe-fonts';\n\ntype propagateFn = (value: {family: string}) => void;\n\nexport interface GoogleFontSelectorValue {\n    family: string;\n}\n\n@Component({\n    selector: 'google-font-selector',\n    templateUrl: './google-font-selector.component.html',\n    styleUrls: ['./google-font-selector.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: GoogleFontSelectorComponent,\n            multi: true,\n        },\n    ],\n})\nexport class GoogleFontSelectorComponent\n    implements OnInit, OnDestroy, ControlValueAccessor\n{\n    activePage$ = new BehaviorSubject<number>(0);\n    chunkedFonts$ = new BehaviorSubject<FontConfig[][]>(null);\n    selectedFamily$ = new BehaviorSubject<string>(null);\n\n    filters = new FormGroup({\n        query: new FormControl(),\n        category: new FormControl(null),\n    });\n\n    from$ = this.activePage$.pipe(map(p => p * this.perPage + 1));\n    total$ = new BehaviorSubject<number>(1052);\n    to$ = this.from$.pipe(\n        map(from => Math.min(from + this.perPage - 1), this.total$.value)\n    );\n\n    fonts$: Observable<FontConfig[]> = combineLatest(\n        this.activePage$,\n        this.chunkedFonts$\n    ).pipe(\n        map(([page, chunkedFonts]) => {\n            return chunkedFonts ? chunkedFonts[page] : [];\n        })\n    );\n\n    private allFonts: FontConfig[];\n    private perPage = 20;\n    private fontSub: Subscription;\n    private formSub: Subscription;\n    private propagateChange: propagateFn;\n\n    constructor(private googleFonts: GoogleFontService) {}\n\n    ngOnInit() {\n        this.allFonts = [...BROWSER_SAFE_FONTS];\n        this.googleFonts.getAll().subscribe(fonts => {\n            this.allFonts = [...this.allFonts, ...fonts];\n            this.chunkFonts(this.allFonts);\n        });\n\n        this.fontSub = this.fonts$.subscribe(fonts => {\n            this.loadIntoDom(fonts);\n        });\n\n        this.formSub = this.filters.valueChanges.subscribe(val => {\n            let fonts = val.query?.length\n                ? filterDatatableData(this.allFonts, val.query)\n                : this.allFonts;\n            fonts = val.category\n                ? fonts.filter(\n                      f =>\n                          f.category.toLowerCase() ===\n                          val.category.toLowerCase()\n                  )\n                : fonts;\n            this.activePage$.next(0);\n            this.chunkFonts(fonts);\n        });\n    }\n\n    ngOnDestroy() {\n        this.formSub.unsubscribe();\n        this.fontSub.unsubscribe();\n    }\n\n    selectFamily(family: string) {\n        this.selectedFamily$.next(family);\n        this.propagateChange({family});\n    }\n\n    haveNext(): boolean {\n        return this.chunkedFonts$.value?.length > this.activePage$.value + 1;\n    }\n\n    havePrev(): boolean {\n        return this.activePage$.value > 0;\n    }\n\n    nextPage() {\n        this.activePage$.next(this.activePage$.value + 1);\n    }\n\n    prevPage() {\n        this.activePage$.next(this.activePage$.value - 1);\n    }\n\n    registerOnChange(fn: propagateFn) {\n        this.propagateChange = fn;\n    }\n\n    writeValue(value: {family: string}) {\n        this.selectedFamily$.next(value?.family);\n    }\n\n    registerOnTouched(fn: any) {}\n\n    private chunkFonts(fonts: FontConfig[]) {\n        const chunkSize = this.perPage;\n        const chunked = [];\n        for (let i = 0, len = fonts.length; i < len; i += chunkSize) {\n            chunked.push(fonts.slice(i, i + chunkSize));\n        }\n        this.chunkedFonts$.next(chunked);\n        this.total$.next(fonts.length);\n    }\n\n    private loadIntoDom(fonts: FontConfig[]) {\n        this.googleFonts.loadIntoDom(fonts, 'google-font-selector');\n    }\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\n\n@Component({\n    selector: 'biolink-editor-fonts',\n    templateUrl: './biolink-editor-fonts.component.html',\n    styleUrls: ['./biolink-editor-fonts.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BiolinkEditorFontsComponent {\n    constructor(public editor: BiolinkEditorService) {}\n}\n","<h3 trans>Fonts</h3>\n\n<div class=\"material-panel\">\n  <google-font-selector [formControl]=\"editor.appearanceForm.get('fontConfig')\"></google-font-selector>\n</div>\n","<h3 trans>Buttons</h3>\n\n<div class=\"material-panel\" *ngIf=\"active$ | async as active\">\n  <h4 trans>Raised</h4>\n  <div class=\"row\">\n    <div class=\"border\" [class.active]=\"active.type === 'raised' && active.variant === 'square'\">\n      <button\n        type=\"button\"\n        class=\"btn-square\"\n        color=\"accent\"\n        mat-raised-button\n        (click)=\"changeBtnType('raised', 'square')\"\n        trans\n      >\n        Square\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'raised' && active.variant === 'rounded'\">\n      <button\n        type=\"button\"\n        color=\"accent\"\n        mat-raised-button\n        (click)=\"changeBtnType('raised', 'rounded')\"\n        trans\n      >\n        Rounded\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'raised' && active.variant === 'pill'\">\n      <button\n        type=\"button\"\n        class=\"btn-pill\"\n        color=\"accent\"\n        mat-raised-button\n        (click)=\"changeBtnType('raised', 'pill')\"\n        trans\n      >\n        Pill\n      </button>\n    </div>\n  </div>\n\n  <h4 trans>Flat</h4>\n  <div class=\"row\">\n    <div class=\"border\" [class.active]=\"active.type === 'flat' && active.variant === 'square'\">\n      <button\n        type=\"button\"\n        class=\"btn-square\"\n        color=\"accent\"\n        mat-flat-button\n        (click)=\"changeBtnType('flat', 'square')\"\n        trans\n      >\n        Square\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'flat' && active.variant === 'rounded'\">\n      <button\n        type=\"button\"\n        color=\"accent\"\n        mat-flat-button\n        (click)=\"changeBtnType('flat', 'rounded')\"\n        trans\n      >\n        Rounded\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'flat' && active.variant === 'pill'\">\n      <button\n        type=\"button\"\n        class=\"btn-pill\"\n        color=\"accent\"\n        (click)=\"changeBtnType('flat', 'pill')\"\n        mat-flat-button\n        trans\n      >\n        Pill\n      </button>\n    </div>\n  </div>\n\n  <h4 trans>Outline</h4>\n  <div class=\"row\">\n    <div class=\"border\" [class.active]=\"active.type === 'stroked' && active.variant === 'square'\">\n      <button\n        type=\"button\"\n        class=\"btn-square\"\n        color=\"accent\"\n        mat-stroked-button\n        (click)=\"changeBtnType('stroked', 'square')\"\n        trans\n      >\n        Square\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'stroked' && active.variant === 'rounded'\">\n      <button\n        type=\"button\"\n        color=\"accent\"\n        mat-stroked-button\n        (click)=\"changeBtnType('stroked', 'rounded')\"\n        trans\n      >\n        Rounded\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'stroked' && active.variant === 'pill'\">\n      <button\n        type=\"button\"\n        class=\"btn-pill\"\n        color=\"accent\"\n        (click)=\"changeBtnType('stroked', 'pill')\"\n        mat-stroked-button\n        trans\n      >\n        Pill\n      </button>\n    </div>\n  </div>\n\n  <h4 trans>Basic</h4>\n  <div class=\"row\">\n    <div class=\"border\" [class.active]=\"active.type === 'basic' && active.variant === 'square'\">\n      <button\n        type=\"button\"\n        class=\"btn-square basic-btn\"\n        color=\"accent\"\n        mat-button\n        (click)=\"changeBtnType('basic', 'square')\"\n        trans\n      >\n        Square\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'basic' && active.variant === 'rounded'\">\n      <button\n        type=\"button\"\n        color=\"accent\"\n        class=\"basic-btn\"\n        mat-button\n        (click)=\"changeBtnType('basic', 'rounded')\"\n        trans\n      >\n        Rounded\n      </button>\n    </div>\n    <div class=\"border\" [class.active]=\"active.type === 'basic' && active.variant === 'pill'\">\n      <button\n        type=\"button\"\n        class=\"btn-pill basic-btn\"\n        color=\"accent\"\n        mat-button\n        (click)=\"changeBtnType('basic', 'pill')\"\n        trans\n      >\n        Pill\n      </button>\n    </div>\n  </div>\n\n  <color-picker-input [formControl]=\"colorControl\" trans>Button Color</color-picker-input>\n</div>\n","import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core';\nimport {BiolinkEditorService} from '../../biolink-editor.service';\nimport {map, startWith} from 'rxjs/operators';\nimport {Observable} from 'rxjs';\nimport {BiolinkBtnConfig} from '../../../biolink';\nimport {FormControl} from '@angular/forms';\n\n@Component({\n    selector: 'biolink-editor-buttons',\n    templateUrl: './biolink-editor-buttons.component.html',\n    styleUrls: ['./biolink-editor-buttons.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BiolinkEditorButtonsComponent implements OnInit {\n    colorControl = new FormControl();\n    active$: Observable<BiolinkBtnConfig> = this.editor.appearanceForm\n        .get('btnConfig')\n        .valueChanges.pipe(\n            startWith({}),\n            map(c => c ?? {})\n        );\n\n    constructor(private editor: BiolinkEditorService) {}\n\n    ngOnInit() {\n        this.colorControl.valueChanges.subscribe(color => {\n            this.editor.appearanceForm.get('btnConfig.color').setValue(color);\n            this.editor.appearanceForm.markAsDirty();\n        });\n    }\n\n    changeBtnType(\n        type: BiolinkBtnConfig['type'],\n        variant: BiolinkBtnConfig['variant']\n    ) {\n        this.editor.appearanceForm.patchValue({\n            btnConfig: {\n                type,\n                variant,\n            },\n        });\n        this.editor.appearanceForm.markAsDirty();\n    }\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {BiolinkEditorService} from '../biolink-editor.service';\n\n@Component({\n    selector: 'biolink-appearance',\n    templateUrl: './biolink-appearance.component.html',\n    styleUrls: ['./biolink-appearance.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BiolinkAppearanceComponent {\n    constructor(public editor: BiolinkEditorService) {}\n}\n","<h2 trans>Custom Appearance</h2>\n<p class=\"tab-description\" trans>\n  Fully customize your Biolink. Change background color or select gradients and images. Choose\n  button style, text color, typeface and more.\n</p>\n\n<button\n  mat-raised-button\n  type=\"button\"\n  color=\"accent\"\n  class=\"save-button\"\n  [disabled]=\"(editor.loading$ | async) || editor.appearanceForm.pristine\"\n  (click)=\"editor.saveAppearance()\"\n  trans\n>\n  Save Changes\n</button>\n\n<h3 trans>Background</h3>\n<div class=\"material-panel\">\n  <background-selector [formControl]=\"editor.appearanceForm.get('bgConfig')\"></background-selector>\n</div>\n\n<biolink-editor-fonts></biolink-editor-fonts>\n<biolink-editor-buttons></biolink-editor-buttons>\n","<form class=\"material-panel\" ngNativeValidate (ngSubmit)=\"saveSettings()\">\n  <div [formGroup]=\"linkForm.formGroup\" *ngIf=\"errors$ | async as errors\">\n    <div class=\"input-container name-container\">\n      <label for=\"link-group-name\" trans>Name</label>\n      <input type=\"text\" id=\"link-group-name\" formControlName=\"name\" required minlength=\"3\" />\n      <div class=\"error\" *ngIf=\"errors.name\">{{ errors.name }}</div>\n    </div>\n    <div class=\"input-container slug-container\">\n      <slug-control [baseUri]=\"slugBaseUri$ | async\" formControlName=\"hash\"></slug-control>\n      <div class=\"error\" *ngIf=\"errors.hash\">{{ errors.hash }}</div>\n    </div>\n    <div class=\"input-container\">\n      <label for=\"link-group-description\" trans>Description</label>\n      <textarea id=\"link-group-description\" formControlName=\"description\"></textarea>\n    </div>\n  </div>\n  <link-options-form\n    [featuresToHide]=\"hiddenFeatures\"\n    [linkOptions]=\"options$ | async\"\n    resourceName=\"biolink\"\n  ></link-options-form>\n  <button type=\"submit\" mat-raised-button [disabled]=\"editor.loading$ | async\" color=\"accent\" trans>\n    Save\n  </button>\n</form>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {LinkForm} from '../../../../shared/link/link.form';\nimport {ValueLists} from '@common/core/services/value-lists.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport {LinkOptionsList} from '../../../link/types';\nimport {FormBuilder} from '@angular/forms';\nimport {LinkGroup} from '../../../../shared/link/link-group';\nimport {Settings} from '@common/core/config/settings.service';\nimport {BiolinkEditorService} from '../biolink-editor.service';\nimport { filter, finalize, take } from 'rxjs/operators';\nimport {CrupdateLinkFeature} from '../../../link/crupdate-link-feature';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\n\n@Component({\n    selector: 'biolink-settings',\n    templateUrl: './biolink-settings.component.html',\n    styleUrls: ['./biolink-settings.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [LinkForm],\n})\nexport class BiolinkSettingsComponent implements OnInit {\n    hiddenFeatures: {[key in CrupdateLinkFeature]?: boolean} = {\n        alias: true,\n        linkGroups: true,\n        details: true,\n    };\n    slugBaseUri$ = new BehaviorSubject<string>(null);\n    options$ = new BehaviorSubject<LinkOptionsList>(null);\n    form = this.fb.group({\n        name: '',\n    });\n    errors$ = new BehaviorSubject<Partial<LinkGroup>>({});\n\n    constructor(\n        public linkForm: LinkForm,\n        private valueLists: ValueLists,\n        private currentUser: CurrentUser,\n        private fb: FormBuilder,\n        private settings: Settings,\n        public editor: BiolinkEditorService,\n        private toast: Toast,\n    ) {}\n\n    ngOnInit() {\n        this.valueLists\n            .get(['countries', 'domains', 'pixels'], {\n                userId: this.currentUser.get('id'),\n            })\n            .subscribe(response => {\n                this.options$.next(response);\n            });\n\n        // on domain change wait until domain list is loaded from backend\n        combineLatest(\n            this.linkForm.formGroup.get('domain_id').valueChanges,\n            this.options$.pipe(filter(o => !!o)),\n        ).subscribe(([domainId, _]) => {\n            this.setSlugBaseUri(domainId);\n        });\n\n        this.editor.biolink$\n            .pipe(\n                filter(biolink => !!biolink),\n                take(1)\n            )\n            .subscribe(biolink => {\n                this.linkForm.patchValue(biolink);\n            });\n    }\n\n    saveSettings() {\n        this.editor.loading$.next(true);\n        return this.editor.biolinks\n            .update(this.editor.biolink$.value.id, this.linkForm.value() as any)\n            .pipe(finalize(() => this.editor.loading$.next(false)))\n            .subscribe(() => {\n                this.toast.open('Biolink updated');\n            }, (err: BackendErrorResponse) => this.errors$.next(err.errors));\n    }\n\n    private setSlugBaseUri(domainId: number) {\n        if (domainId) {\n            this.slugBaseUri$.next(\n                this.options$.value.domains.find(d => d.id === domainId).host\n            );\n        } else {\n            this.slugBaseUri$.next(this.settings.getBaseUrl());\n        }\n    }\n}\n","<div class=\"left-col\">\n  <mat-tab-group\n    dynamicHeight\n    color=\"accent\"\n    (selectedTabChange)=\"tabChanged($event)\"\n    [selectedIndex]=\"editor.activeTab$ | async\"\n    animationDuration=\"0\"\n  >\n    <mat-tab [label]=\"'Content' | trans\">\n      <ng-template matTabContent>\n        <biolink-editor-content class=\"left-col-spacer\"></biolink-editor-content>\n      </ng-template>\n    </mat-tab>\n    <mat-tab [label]=\"'Appearance' | trans\">\n      <ng-template matTabContent>\n        <biolink-appearance class=\"left-col-spacer\"></biolink-appearance>\n      </ng-template>\n    </mat-tab>\n    <mat-tab [label]=\"'Settings' | trans\">\n      <ng-template matTabContent>\n        <biolink-settings class=\"left-col-spacer\"></biolink-settings>\n      </ng-template>\n    </mat-tab>\n  </mat-tab-group>\n</div>\n<div class=\"right-col\">\n  <div class=\"preview-title\" *ngIf=\"editor.biolink$ | async as biolink\">\n    <div class=\"link\">\n      <a [href]=\"biolink.short_url\" target=\"_blank\">{{biolink.short_url}}</a>\n    </div>\n    <share-link-btns [showCopyBtn]=\"true\" [colored]=\"true\" [link]=\"biolink\"></share-link-btns>\n  </div>\n  <div class=\"phone-preview\">\n    <biolink-page\n      [biolink]=\"editor.biolink$ | async\"\n      [appearance]=\"appearance$ | async\"\n    ></biolink-page>\n  </div>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {BiolinksService} from '../biolinks.service';\nimport {BiolinkWidgetsService} from './widgets/biolink-widgets.service';\nimport {startWith} from 'rxjs/operators';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {MatTabChangeEvent} from '@angular/material/tabs';\nimport {\n    BiolinkEditorService,\n    BiolinkEditorTabs,\n} from './biolink-editor.service';\n\n@Component({\n    selector: 'biolink-editor',\n    templateUrl: './biolink-editor.component.html',\n    styleUrls: ['./biolink-editor.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BiolinkEditorComponent implements OnInit {\n    appearance$ = this.editor.appearanceForm.valueChanges.pipe(startWith({}));\n\n    constructor(\n        private modal: Modal,\n        private biolinks: BiolinksService,\n        private widgets: BiolinkWidgetsService,\n        private route: ActivatedRoute,\n        private toast: Toast,\n        public settings: Settings,\n        private router: Router,\n        public editor: BiolinkEditorService\n    ) {}\n\n    ngOnInit() {\n        this.route.params.subscribe(params => {\n            this.editor.reloadBiolink(params.linkId);\n        });\n        this.route.queryParams.subscribe(query => {\n            this.editor.activeTab$.next(\n                BiolinkEditorTabs[query.tab || 'links']\n            );\n        });\n    }\n\n    tabChanged(e: MatTabChangeEvent) {\n        this.router.navigate([], {\n            queryParams: {tab: Object.entries(BiolinkEditorTabs)[e.index][0]},\n            replaceUrl: true,\n        });\n    }\n}\n","<div class=\"datatable-page-header\">\n  <h1>\n    <span trans>Biolinks</span>\n    <info-popover>\n      <div class=\"title\" trans>Link in Bio</div>\n      <div trans>Offer multiple choices to your followers when they click on your Biolink. Share all your Social Media profiles, videos, songs, articles and other important links with just one url.</div>\n    </info-popover>\n  </h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"biolinks\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <permission-aware-button permission=\"biolinks.create\">\n        <button\n          mat-raised-button\n          color=\"accent\"\n          class=\"button-with-icon\"\n          (click)=\"openCreateBiolinkModal()\"\n          trans\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>Add New Biolink</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n    <tr>\n      <th table-header-checkbox></th>\n      <th table-sort-header trans>Name</th>\n      <th *ngIf=\"showUserColumn()\" table-sort-header=\"user_id\" trans>Owner</th>\n      <th table-sort-header=\"links_count\" trans>Links</th>\n      <th table-sort-header=\"public\" trans>Public</th>\n      <th table-sort-header=\"rotator\" trans>Rotator</th>\n      <th table-sort-header=\"updated_at\" trans>Last Updated</th>\n      <th></th>\n    </tr>\n    <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n      <th colspan=\"6\">\n        <div\n          class=\"bulk-actions-title\"\n          [transValues]=\"{count: selectedCount, resource: 'biolink(s)'}\"\n          trans\n        >\n          :count :resource selected:\n        </div>\n        <div class=\"bulk-actions\">\n          <permission-aware-button permission=\"biolinks.delete\">\n            <button\n              type=\"button\"\n              mat-raised-button\n              color=\"warn\"\n              (click)=\"maybeDeleteSelectedBiolinks()\"\n              trans\n            >\n              Delete\n            </button>\n          </permission-aware-button>\n        </div>\n      </th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr *ngFor=\"let biolink of biolinks$ | async\">\n      <td [table-body-checkbox]=\"biolink.id\"></td>\n      <td data-label=\"Name\">\n        <a class=\"link-group-name\" [routerLink]=\"['/', biolink.hash]\" target=\"_blank\">{{\n          biolink.name\n          }}</a>\n      </td>\n      <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n        <user-column [user]=\"biolink.user\"></user-column>\n      </td>\n      <td data-label=\"Link Count\">{{ biolink.links_count }}</td>\n      <td data-label=\"Public\">\n        <mat-icon svgIcon=\"check\" *ngIf=\"biolink.active\"></mat-icon>\n        <span *ngIf=\"!biolink.active\">-</span>\n      </td>\n      <td data-label=\"Rotator\">\n        <mat-icon svgIcon=\"check\" *ngIf=\"biolink.rotator\"></mat-icon>\n        <span *ngIf=\"!biolink.rotator\">-</span>\n      </td>\n      <td data-label=\"Last Updated\">{{ biolink.updated_at | formattedDate }}</td>\n      <td class=\"edit-column\">\n        <button\n          type=\"button\"\n          mat-icon-button\n          [routerLink]=\"[biolink.id, 'analytics']\"\n          [matTooltip]=\"'Analytics' | trans\"\n        >\n          <mat-icon svgIcon=\"bar-chart\"></mat-icon>\n        </button>\n        <permission-aware-button\n          permission=\"biolinks.update\"\n          [userOwnsResource]=\"currentUser.get('id') === biolink.user_id\"\n        >\n          <button\n            [routerLink]=\"[biolink.id, 'edit']\"\n            mat-icon-button\n            [matTooltip]=\"'Edit' | trans\"\n          >\n            <mat-icon svgIcon=\"edit\"></mat-icon>\n          </button>\n        </permission-aware-button>\n        <copy-link-btn [model]=\"biolink\"></copy-link-btn>\n        <permission-aware-button permission=\"biolinks.delete\" class=\"visible-on-mobile\">\n          <button\n            type=\"button\"\n            mat-icon-button\n            (click)=\"maybeDeleteSelectedBiolinks([biolink.id])\"\n            trans\n          >\n            <mat-icon svgIcon=\"delete\"></mat-icon>\n          </button>\n        </permission-aware-button>\n      </td>\n    </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"marketing.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No biolinks have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {Observable, Subscription} from 'rxjs';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {LINK_GROUP_INDEX_FILTERS} from '../../link-group/link-group-index/link-group-index-filters';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {ActiveAppSectionService} from '../../active-app-section.service';\nimport {Biolink} from '../biolink';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {\n    CrupdateLinkGroupModalComponent,\n    CrupdateLinkGroupModalData,\n} from '../../link-group/crupdate-link-group-modal/crupdate-link-group-modal.component';\nimport {BiolinksService} from '../biolinks.service';\n\n@Component({\n    selector: 'biolink-index',\n    templateUrl: './biolink-index.component.html',\n    styleUrls: ['./biolink-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class BiolinkIndexComponent implements OnInit, OnDestroy {\n    biolinks$ = this.datatable.data$ as Observable<Biolink[]>;\n    filters = LINK_GROUP_INDEX_FILTERS;\n    private workspaceSub: Subscription;\n\n    constructor(\n        public datatable: DatatableService<Biolink>,\n        public currentUser: CurrentUser,\n        private biolinks: BiolinksService,\n        private toast: Toast,\n        private route: ActivatedRoute,\n        private linkUsage: LinkUsageService,\n        private activeSection: ActiveAppSectionService,\n        private workspaces: WorkspacesService,\n        private modal: Modal,\n        private router: Router\n    ) {}\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: BiolinksService.BASE_URI,\n            staticParams: {\n                with: ['user'],\n                withCount: ['links'],\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    maybeDeleteSelectedBiolinks(biolinkIds?: number[]) {\n        this.datatable.confirmResourceDeletion('biolinks').subscribe(() => {\n            this.biolinks\n                .delete(biolinkIds || this.datatable.selectedRows$.value)\n                .subscribe(\n                    () => {\n                        this.datatable.reset();\n                        this.toast.open('Biolink deleted');\n                    },\n                    (errResponse: BackendErrorResponse) => {\n                        this.toast.open(\n                            errResponse.message || HttpErrors.Default\n                        );\n                    }\n                );\n        });\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = LINK_GROUP_INDEX_FILTERS.filter(\n            f => f.key !== 'user_id' || this.showUserColumn()\n        );\n    }\n\n    openCreateBiolinkModal() {\n        this.modal\n            .open(CrupdateLinkGroupModalComponent, {\n                type: 'biolink',\n            } as CrupdateLinkGroupModalData)\n            .afterClosed()\n            .subscribe(biolink => {\n                if (biolink) {\n                    const prefix = this.activeSection.admin\n                        ? 'admin'\n                        : 'dashboard';\n                    this.router.navigate([\n                        '/',\n                        prefix,\n                        'biolinks',\n                        biolink.id,\n                        'edit',\n                    ]);\n                }\n            });\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {LinkStats} from '../../shared/link/link.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {Biolink, BiolinkAppearance} from './biolink';\nimport {BiolinkWidget} from './biolink-editor/widgets/biolink-widget';\nimport {Link} from '../../shared/link/link';\nimport {BiolinkLink} from './biolink-editor/biolink-link';\n\nexport interface BiolinkItemConfig {\n    animation?: string;\n    leap_until?: string;\n    active?: boolean;\n}\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class BiolinksService {\n    static BASE_URI = 'biolink';\n    constructor(private http: AppHttpClient) {}\n\n    get(\n        id: number,\n        params: {with: string[]}\n    ): BackendResponse<{biolink: Biolink}> {\n        return this.http.get(`${BiolinksService.BASE_URI}/${id}`, params);\n    }\n\n    create(params: Partial<Biolink>): BackendResponse<{biolink: Biolink}> {\n        return this.http.post(BiolinksService.BASE_URI, params);\n    }\n\n    update(id, params: Partial<Biolink>): BackendResponse<{biolink: Biolink}> {\n        return this.http.put(`${BiolinksService.BASE_URI}/${id}`, params);\n    }\n\n    delete(ids: number[]): BackendResponse<void> {\n        return this.http.delete(`${BiolinksService.BASE_URI}/${ids}`);\n    }\n\n    detach(groupId: number, contentItem: BiolinkLink | BiolinkWidget) {\n        return this.http.post(`${BiolinksService.BASE_URI}/${groupId}/detach`, {\n            contentItem,\n        });\n    }\n\n    changeOrder(id: number, params: {id: number; model_type: string}[]) {\n        return this.http.post(\n            `${BiolinksService.BASE_URI}/${id}/change-order`,\n            {order: params}\n        );\n    }\n\n    analytics(\n        biolinkId: number\n    ): BackendResponse<{analytics: LinkStats, biolink: Biolink}> {\n        return this.http.get(this.analyticsEndpoint(biolinkId));\n    }\n\n    analyticsEndpoint(biolinkId: number): string {\n        return `${BiolinksService.BASE_URI}/${biolinkId}/analytics`;\n    }\n\n    saveAppearance(id: number, config: BiolinkAppearance) {\n        return this.http.post(`${BiolinksService.BASE_URI}/${id}/appearance`, {\n            config,\n        });\n    }\n\n    updateContentItemConfig(\n        biolinkId: number,\n        contentItem: BiolinkWidget | Link,\n        config: BiolinkItemConfig\n    ) {\n        return this.http.post(\n            `${BiolinksService.BASE_URI}/${biolinkId}/update-content-config`,\n            {\n                item_id: contentItem.id,\n                item_model_type: contentItem.model_type,\n                ...config,\n            }\n        );\n    }\n}\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {filter} from 'rxjs/operators';\n\n@Component({\n    selector: 'between-input',\n    templateUrl: './between-input.component.html',\n    styleUrls: ['./between-input.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: BetweenInputComponent,\n        multi: true,\n    }]\n})\nexport class BetweenInputComponent implements ControlValueAccessor {\n    @Input() setDefaultDate = false;\n    @Input() showLabels = false;\n    public datePattern = '([12]\\\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01]))';\n    private initiated = false;\n    public defaultFrom: string;\n    public defaultTo: string;\n    private propagateChange: Function;\n    public form = this.fb.group({\n        from: [''],\n        to: [''],\n    });\n\n    constructor(public fb: FormBuilder) {\n        this.defaultFrom = this.getDefaultDate(7);\n        this.defaultTo = this.getDefaultDate();\n    }\n\n    public writeValue(value: string|string[]) {\n        if ( ! Array.isArray(value)) {\n            value =  (value || '').split(':');\n        }\n        let [from, to] = value;\n\n        if ( ! this.initiated && this.setDefaultDate) {\n            from = from || this.defaultFrom;\n            to = to || this.defaultTo;\n        }\n\n        this.initiated = true;\n        this.form.patchValue({from, to});\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n        this.form.valueChanges\n            // only emit if user has set values to both to and from inputs\n            .pipe(filter(value => value.from && value.to))\n            .subscribe(value => {\n                const between = `${value.from}:${value.to}`;\n                this.propagateChange(between);\n            });\n    }\n\n    public registerOnTouched() {}\n\n    private getDefaultDate(minusDays: number = 0) {\n        const d = new Date();\n        d.setDate(d.getDate() - minusDays);\n        const month = this.addZero(d.getMonth() + 1),\n            day = this.addZero(d.getDate());\n        return `${d.getFullYear()}-${month}-${day}`;\n    }\n\n    private addZero(number: number): string {\n        return number < 10 ? '0' + number : '' + number;\n    }\n}\n","<fieldset [formGroup]=\"form\">\n    <legend trans>\n        <ng-content></ng-content>\n    </legend>\n   <div class=\"inline-inputs-container\">\n       <div class=\"input-container\">\n           <label for=\"from\" [class.hidden]=\"!showLabels\" trans>From</label>\n           <input type=\"date\" id=\"from\" formControlName=\"from\" [placeholder]=\"defaultFrom\" [pattern]=\"datePattern\" required>\n       </div>\n       <div class=\"input-container\">\n           <label for=\"to\" [class.hidden]=\"!showLabels\" trans>To</label>\n           <input type=\"date\" id=\"to\" formControlName=\"to\" [placeholder]=\"defaultTo\" [pattern]=\"datePattern\" required>\n       </div>\n   </div>\n</fieldset>","<ng-container *ngIf=\"transformedReports$ | async as reports\">\n    <header class=\"date-header\">\n        <mat-button-toggle-group class=\"right\" [formControl]=\"range\">\n            <mat-button-toggle value=\"hourly\" trans>Hourly</mat-button-toggle>\n            <mat-button-toggle value=\"weekly\" trans>Weekly</mat-button-toggle>\n            <mat-button-toggle value=\"monthly\" trans>Monthly</mat-button-toggle>\n            <mat-button-toggle value=\"yearly\" trans>Yearly</mat-button-toggle>\n            <mat-button-toggle value=\"custom\" trans>Custom</mat-button-toggle>\n        </mat-button-toggle-group>\n\n       <div class=\"custom-date-container\" *ngIf=\"(range.valueChanges | async) === 'custom'\">\n           <between-input class=\"click-charts-date-input\" [formControl]=\"customRangeControl\"></between-input>\n           <button type=\"button\" mat-raised-button color=\"accent\" class=\"apply-custom-range-button\" [disabled]=\"!(customRangeControl.valueChanges | async)\" (click)=\"customRange$.next(customRangeControl.value)\" trans>Apply</button>\n       </div>\n    </header>\n\n    <div class=\"chart-row\">\n        <div class=\"chart-wrapper\">\n            <chart [chartConfig]=\"reports.clicks\" class=\"clicks-chart\" height=\"400\">\n                <div class=\"chart-header clicks-chart-header\">\n                    <div class=\"left\">\n                        <div class=\"title\" trans>{{ ('Clicks this ' + getRangeName()) | trans }}</div>\n                        <div class=\"subtitle\">{{reports.totalClicks}} {{ 'Total Clicks' | trans }}</div>\n                    </div>\n                </div>\n            </chart>\n        </div>\n        <div class=\"chart-wrapper pie-wrapper\">\n            <chart [chartConfig]=\"reports.devices\" height=\"385\">\n                <div class=\"chart-header\">\n                    <div class=\"title\" trans>Top Devices</div>\n                    <div class=\"subtitle\" trans>Click count by device</div>\n                </div>\n            </chart>\n        </div>\n    </div>\n\n    <div class=\"chart-row\">\n        <div class=\"chart-wrapper referrers-panel\">\n            <div class=\"chart\">\n                <div class=\"chart-header\">\n                    <div class=\"title\" trans>Referrers</div>\n                    <div class=\"subtitle\" trans>Click count by referrer</div>\n                </div>\n                <ul class=\"unstyled-list\">\n                    <li class=\"referrer\" *ngFor=\"let referrer of reports.referrers\">\n                        <a [href]=\"referrer.label\" class=\"url\" target=\"_blank\" *ngIf=\"referrer.label; else direct\">{{referrer.label}}</a>\n                        <ng-template #direct>\n                            <div trans>Direct, Email, SMS</div>\n                        </ng-template>\n                        <div class=\"count\">{{referrer.count}}</div>\n                    </li>\n                </ul>\n            </div>\n        </div>\n\n        <div class=\"chart-wrapper locations-panel\">\n            <div class=\"chart\">\n                <div class=\"chart-header\">\n                    <div class=\"title\" trans>Top Locations</div>\n                    <div class=\"subtitle\" trans>Click count by country</div>\n                </div>\n                <div class=\"chart-body\">\n                    <div class=\"country-chart-placeholder\" #countryChartPlaceholder></div>\n                    <div class=\"country-list\">\n                        <div class=\"country\" *ngFor=\"let country of reports.locations\">\n                            <span class=\"country-name\">{{country.label}}</span> ({{country.percentage}}%)\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"chart-row\">\n        <div class=\"chart-wrapper pie-wrapper\">\n            <chart [chartConfig]=\"reports.browsers\" height=\"385\">\n                <div class=\"chart-header\">\n                    <div class=\"title\" trans>Top Browsers</div>\n                    <div class=\"subtitle\" trans>Click count by browser</div>\n                </div>\n            </chart>\n        </div>\n\n        <div class=\"chart-wrapper pie-wrapper\">\n            <chart [chartConfig]=\"reports.platforms\" height=\"385\">\n                <div class=\"chart-header\">\n                    <div class=\"title\" trans>Top Platforms</div>\n                    <div class=\"subtitle\" trans>Click count by OS</div>\n                </div>\n            </chart>\n        </div>\n    </div>\n</ng-container>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    Input,\n    OnChanges,\n    OnInit,\n    SimpleChanges,\n    ViewChild\n} from '@angular/core';\nimport {LinkReportRange, LinkService, LinkStats} from '../../shared/link/link.service';\nimport {FormControl} from '@angular/forms';\nimport {filter, finalize, map, tap} from 'rxjs/operators';\nimport {BehaviorSubject, combineLatest} from 'rxjs';\nimport {\n    ChartType,\n    LineChartConfig,\n    PieChartConfig\n} from '@common/shared/charts/base-chart';\nimport {LazyLoaderService} from '@common/core/utils/lazy-loader.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {ThemeService} from '@common/core/theme.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {Translations} from '@common/core/translations/translations.service';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {AnalyticsResponse} from '@common/admin/analytics/types/analytics-response';\nimport {hasKey} from '@common/core/utils/has-key';\n\ninterface ChartReports {\n    totalClicks: number;\n    clicks: LineChartConfig;\n    browsers: PieChartConfig;\n    devices: PieChartConfig;\n    platforms: PieChartConfig;\n    locations: { label: string, code: string, percentage: number, count: number }[];\n    referrers: { label: string, count: number }[];\n}\n\n@Component({\n    selector: 'click-charts',\n    templateUrl: './click-charts.component.html',\n    styleUrls: ['./click-charts.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ClickChartsComponent implements OnInit, OnChanges {\n    @Input() reports: LinkStats;\n    @Input() endpoint = `${LinkService.BASE_URI}/analytics`;\n    @ViewChild('countryChartPlaceholder') iframe: ElementRef<HTMLDivElement>;\n    public transformedReports$ = new BehaviorSubject<Partial<ChartReports>>({});\n    public loading$ = new BehaviorSubject(false);\n    public range = new FormControl('weekly');\n    public customRangeControl = new FormControl();\n    public customRange$ = new BehaviorSubject<string>('');\n    private googleChart;\n\n    constructor(\n        private loader: LazyLoaderService,\n        private theme: ThemeService,\n        private settings: Settings,\n        private i18n: Translations,\n        private http: AppHttpClient,\n    ) {}\n\n    public ngOnChanges(changes: SimpleChanges) {\n        if (changes.reports && changes.reports.currentValue) {\n            this.updateCharts(changes.reports.currentValue);\n            this.initGoogleWorldMap();\n        }\n    }\n\n    ngOnInit() {\n        combineLatest([this.range.valueChanges, this.customRange$])\n            .pipe(\n                filter(([range, customRange]) => range !== 'custom' || !!customRange),\n                tap(() => this.loading$.next(true)),\n            ).subscribe(([range, customRange]) => {\n                this.getUpdateDataRequest(range, customRange)\n                    .pipe(finalize(() => this.loading$.next(false)))\n                    .subscribe(analytics => {\n                        this.updateCharts(analytics);\n                        this.drawGoogleChart();\n                    });\n            });\n\n        // update google chart colors on dark/light mode toggle\n        this.theme.selectedTheme$.subscribe(() => {\n            if (this.googleChart) {\n                this.drawGoogleChart();\n            }\n        });\n    }\n\n    public getRangeName() {\n        if (this.range.value === 'custom') {\n            return 'period';\n        } else {\n            // weekly => Week\n            return this.range.value.replace('ly', '');\n        }\n    }\n\n    private getUpdateDataRequest(range: LinkReportRange, customRange?: string): BackendResponse<LinkStats> {\n        return this.http.get<AnalyticsResponse<LinkStats>|{analytics: LinkStats}>(this.endpoint, {range, customRange})\n            .pipe(map(response => hasKey('mainData', response) ? response.mainData : response.analytics));\n    }\n\n    private updateCharts(data: LinkStats) {\n        const reports = {\n            ...data,\n            browsers: this.transformData(data?.browsers, ChartType.PIE) as PieChartConfig,\n            platforms: this.transformData(data?.platforms, ChartType.PIE) as PieChartConfig,\n            devices: this.transformData(data?.devices, ChartType.PIE, true) as PieChartConfig,\n            clicks: this.transformData(data?.clicks, ChartType.LINE) as LineChartConfig,\n        };\n        this.transformedReports$.next(reports);\n    }\n\n    private transformData(data: { label: string, count: number }[], type: ChartType = ChartType.LINE, translateLabel = false) {\n        if ( ! data) return {};\n        return {\n            type,\n            labels: data.map(v => translateLabel ? this.i18n.t(v.label) : v.label),\n            data: type === ChartType.LINE ? [data.map(v => v.count)] : data.map(v => v.count),\n            legend: false,\n            tooltip: this.i18n.t('Click Count'),\n            options: {\n                showLabel: true,\n                donut: true,\n            }\n        };\n    }\n\n    private initGoogleWorldMap() {\n        this.loader.loadAsset('https://www.gstatic.com/charts/loader.js', {type: 'js'}).then(() => {\n            const google = window['google'] as any;\n            google.charts.load('current', {\n                packages: ['geochart'],\n                // See: https://developers.google.com/chart/interactive/docs/basic_load_libs#load-settings\n                mapsApiKey: this.settings.get('links.gchart_api_key'),\n            });\n            google.charts.setOnLoadCallback(() => {\n                this.drawGoogleChart();\n            });\n        });\n    }\n\n    private drawGoogleChart() {\n        const google = window['google'] as any;\n        let data = this.transformedReports$.value.locations.map(location => {\n            return [location.label, location.count];\n        });\n        data.unshift(['Country', 'Popularity']);\n        data = google.visualization.arrayToDataTable(data);\n\n        const options = {\n            colorAxis: {colors: ['#4662fa']},\n            backgroundColor: this.theme.selectedTheme$.value.is_dark ? '#1D1D1D' : null,\n            datalessRegionColor: this.theme.selectedTheme$.value.is_dark ? '#e9ecfe' : null,\n        };\n\n        if ( ! this.googleChart) {\n            this.googleChart = new google.visualization.GeoChart(this.iframe.nativeElement);\n        }\n        this.googleChart.draw(data, options);\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ClickChartsComponent} from './click-charts.component';\nimport {ChartsModule} from '@common/shared/charts/charts.module';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {BetweenDateInputModule} from '../../../common/core/ui/between-date-input/between-date-input.module';\n\n\n@NgModule({\n    declarations: [\n        ClickChartsComponent,\n    ],\n    imports: [\n        CommonModule,\n        ChartsModule,\n        TranslationsModule,\n        ReactiveFormsModule,\n        LoadingIndicatorModule,\n        BetweenDateInputModule,\n\n        // material\n        MatButtonModule,\n        MatIconModule,\n        MatButtonToggleModule,\n    ],\n    exports: [\n        ClickChartsComponent,\n    ]\n})\nexport class ClickChartsModule {\n}\n","<div [matMenuTriggerFor]=\"workspaceMenu\" *ngIf=\"workspaces.activeWorkspace$ | async as selected\">\n    <div class=\"left\">\n        <div class=\"role-name\" trans>{{selected.name}}</div>\n        <div class=\"member-count\">\n            <span *ngIf=\"selected.default\" trans>Personal workspace</span>\n            <span *ngIf=\"!selected.default\" trans>{{ ':count members' | trans:{count: selected?.members_count || 0} }}</span>\n        </div>\n    </div>\n    <div class=\"right\">\n        <mat-icon svgIcon=\"unfold-more\"></mat-icon>\n    </div>\n</div>\n\n<mat-menu #workspaceMenu=\"matMenu\" class=\"workspace-menu\">\n    <div mat-menu-item class=\"workspace-menu-item\" [class.active]=\"(workspaces.activeId$ | async) === workspace.id\" *ngFor=\"let workspace of workspaces.available$ | async\" (click)=\"selectWorkspace(workspace)\">\n        <mat-icon svgIcon=\"check\" [class.visually-hidden]=\"(workspaces.activeId$ | async) !== workspace.id\"></mat-icon>\n        <div>\n            <div class=\"name\" trans>{{workspace.name}}</div>\n            <div class=\"member-count\">\n                <span *ngIf=\"workspace.default\" trans>Personal workspace</span>\n                <span *ngIf=\"!workspace.default\" trans>{{ ':count members' | trans:{count: workspace?.members_count || 0} }}</span>\n            </div>\n        </div>\n        <button type=\"button\" class=\"settings-button\" mat-icon-button *ngIf=\"!workspace.default\" (click)=\"openWorkspaceMembersModal(workspace); $event.stopPropagation()\">\n            <mat-icon svgIcon=\"settings\"></mat-icon>\n        </button>\n    </div>\n    <div mat-menu-item class=\"new-workspace-menu-item\" (click)=\"openCrupdateWorkspaceModal()\" *ngIf=\"currentUser.hasPermission('workspaces.create')\">\n        <mat-icon svgIcon=\"add\"></mat-icon>\n        <span trans>Create new workspace</span>\n    </div>\n</mat-menu>\n","import {\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    OnInit,\n    ViewChild,\n    ViewContainerRef,\n} from '@angular/core';\nimport {Workspace} from '../types/workspace';\nimport {MatMenuTrigger} from '@angular/material/menu';\nimport {WorkspacesService} from '../workspaces.service';\nimport {Modal} from '../../core/ui/dialogs/modal.service';\nimport {CurrentUser} from '../../auth/current-user';\nimport {BackendErrorResponse} from '../../core/types/backend-error-response';\nimport {HttpErrors} from '../../core/http/errors/http-errors.enum';\nimport {ConfirmModalComponent} from '../../core/ui/confirm-modal/confirm-modal.component';\nimport {filter} from 'rxjs/operators';\nimport {DELETE_RESOURCE_MESSAGE} from '../../datatable/delete-resource-message';\nimport {Toast} from '../../core/ui/toast.service';\n\n@Component({\n    selector: 'workspace-selector',\n    templateUrl: './workspace-selector.component.html',\n    styleUrls: ['./workspace-selector.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkspaceSelectorComponent implements OnInit {\n    @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;\n\n    constructor(\n        private modal: Modal,\n        public workspaces: WorkspacesService,\n        public currentUser: CurrentUser,\n        private toast: Toast,\n        private vcr: ViewContainerRef,\n        private cd: ChangeDetectorRef\n    ) {}\n\n    ngOnInit() {\n        this.workspaces.indexUserWorkspaces().subscribe();\n    }\n\n    public openCrupdateWorkspaceModal(workspace?: Workspace) {\n        import('src/common/workspaces/workspace.module').then(m => {\n            // will have wrong WorkspacesService instance without passing viewContainerRef\n            this.modal.open(\n                m.WorkspaceModule.components.crupdateModal,\n                {workspace},\n                {viewContainerRef: this.vcr}\n            );\n            this.cd.markForCheck();\n        });\n    }\n\n    public openWorkspaceMembersModal(workspace: Workspace) {\n        import('src/common/workspaces/workspace.module').then(m => {\n            this.modal.open(\n                m.WorkspaceModule.components.manageMembers,\n                {workspace},\n                {viewContainerRef: this.vcr}\n            );\n            this.cd.markForCheck();\n            this.menuTrigger.closeMenu();\n        });\n    }\n\n    public maybeDeleteWorkspace(workspace: Workspace) {\n        const data = {\n            ...DELETE_RESOURCE_MESSAGE,\n            replacements: {resource: 'workspace'},\n        };\n        this.modal\n            .open(ConfirmModalComponent, data)\n            .afterClosed()\n            .pipe(filter(confirmed => confirmed))\n            .subscribe(() => {\n                this.workspaces.delete([workspace.id]).subscribe(\n                    () => {\n                        this.toast.open('Workspace deleted.');\n                    },\n                    (errResponse: BackendErrorResponse) => {\n                        this.toast.open(\n                            errResponse.message || HttpErrors.Default\n                        );\n                    }\n                );\n            });\n    }\n\n    public selectWorkspace(workspace: Workspace) {\n        this.workspaces.select(workspace.id);\n        this.menuTrigger.closeMenu();\n    }\n}\n","<div class=\"header\">\n    <div class=\"current-plan\">\n        {{ ('Current Plan' | trans) + ': ' + (currentUser.getSubscription()?.plan?.name || ('Free' | trans))}}\n    </div>\n    <div class=\"next-payment\">\n        {{ ('Next Payment' | trans) + ': ' + ((currentUser.getSubscription()?.renews_at | formattedDate) || ('Never' | trans))}}\n    </div>\n</div>\n\n<ul class=\"unstyled-list\" *ngIf=\"(linkUsage.response$ | async).usage as usage\">\n    <li *ngIf=\"usage.links.create\">{{(usage.links.used | number) + ' ' + ('out of' | trans) + ' ' + (usage.links.total || ('Unlimited' | trans)) + ' ' + ('Links' | trans) }}</li>\n  <li *ngIf=\"usage.biolinks.create\">{{(usage.biolinks.used | number) + ' ' + ('out of' | trans) + ' ' + (usage.biolinks.total || ('Unlimited' | trans)) + ' ' + ('Biolinks' | trans) }}</li>\n    <li *ngIf=\"usage.link_clicks.create\">{{(usage.link_clicks.used | number) + ' ' + ('out of' | trans) + ' ' + (usage.link_clicks.total || ('Unlimited' | trans)) + ' ' + ('Visitors' | trans) }}</li>\n    <li *ngIf=\"usage.link_overlays.create\">{{usage.link_overlays.used + ' ' + ('out of' | trans) + ' ' + (usage.link_overlays.total || ('Unlimited' | trans)) + ' ' + ('Link Overlays' | trans) }}</li>\n    <li *ngIf=\"usage.custom_pages.create\">{{usage.custom_pages.used + ' ' + ('out of' | trans) + ' ' + (usage.custom_pages.total || ('Unlimited' | trans)) + ' ' + ('Custom Link Pages' | trans) }}</li>\n    <li *ngIf=\"usage.custom_domains.create\">{{usage.custom_domains.used + ' ' + ('out of' | trans) + ' ' + (usage.custom_domains.total || ('Unlimited' | trans)) + ' ' + ('Custom Domains' | trans) }}</li>\n    <li *ngIf=\"usage.link_groups.create\">{{(usage.link_groups.used | number) + ' ' + ('out of' | trans) + ' ' + (usage.link_groups.total || ('Unlimited' | trans)) + ' ' + ('Link Groups' | trans) }}</li>\n    <li *ngIf=\"usage.tracking_pixels.create\">{{usage.tracking_pixels.used + ' ' + ('out of' | trans) + ' ' + (usage.tracking_pixels.total || ('Unlimited' | trans)) + ' ' + ('Tracking Pixels' | trans) }}</li>\n</ul>\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {CurrentUser} from '@common/auth/current-user';\n\n@Component({\n    selector: 'link-usage-info',\n    templateUrl: './link-usage-info.component.html',\n    styleUrls: ['./link-usage-info.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LinkUsageInfoComponent {\n    constructor(\n        public linkUsage: LinkUsageService,\n        public currentUser: CurrentUser,\n    ) {}\n}\n","<ng-container *ngIf=\"settings.get('billing.enable')\">\n    <div class=\"upgrade-panel\" *ngIf=\"linkUsage.response$ | async as data\">\n        <ng-container *ngIf=\"data.usage.links\">\n            <mat-progress-bar\n                mode=\"determinate\"\n                color=\"accent\"\n                [value]=\"(data.usage.links.used / data.usage.links.total) * 100\"\n            ></mat-progress-bar>\n\n            <div class=\"usage-info\">\n                <div\n                    class=\"text\"\n                    [transValues]=\"{\n                        number: data.usage.links.used | number,\n                        total: (data.usage.links.total | number) || ('Unlimited') | trans\n                    }\"\n                    trans\n                >\n                    :number of :total links created\n                </div>\n                <mat-icon\n                    #infoIcon\n                    svgIcon=\"info\"\n                    class=\"info-icon\"\n                    (click)=\"togglePopover()\"\n                    (mouseenter)=\"openPopover()\"\n                    (mouseleave)=\"closePopover()\"\n                ></mat-icon>\n            </div>\n        </ng-container>\n\n        <div class=\"upgrade-link-container\">\n            <a routerLink=\"/billing/upgrade\" *ngIf=\"!compact\" target=\"_blank\" trans\n                >Upgrade Account</a\n            >\n            <a\n                routerLink=\"/billing/upgrade\"\n                class=\"compact-link\"\n                *ngIf=\"compact\"\n                target=\"_blank\"\n                trans\n                >Upgrade</a\n            >\n        </div>\n    </div>\n</ng-container>\n","import {ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, OnInit, ViewChild} from '@angular/core';\nimport {Settings} from '@common/core/config/settings.service';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {LinkUsageInfoComponent} from '../link-usage-info/link-usage-info.component';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {CurrentUser} from '@common/auth/current-user';\n\n@Component({\n    selector: 'upgrade-panel',\n    templateUrl: './upgrade-panel.component.html',\n    styleUrls: ['./upgrade-panel.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UpgradePanelComponent implements OnInit {\n    @ViewChild('infoIcon', { read: ElementRef }) infoIcon: ElementRef<HTMLElement>;\n    @Input() @HostBinding('class.compact') compact = false;\n    private overlayRef: OverlayPanelRef<LinkUsageInfoComponent>;\n\n    constructor(\n        public settings: Settings,\n        public linkUsage: LinkUsageService,\n        public currentUser: CurrentUser,\n        private overlay: OverlayPanel,\n    ) {}\n\n    ngOnInit() {\n        this.linkUsage.reload();\n    }\n\n    public openPopover() {\n        if (this.overlayRef) {\n           this.closePopover();\n        }\n        const position = {...RIGHT_POSITION};\n        position[0].offsetY = -15;\n        this.overlayRef = this.overlay.open(LinkUsageInfoComponent, {\n            origin: this.infoIcon,\n            position: RIGHT_POSITION,\n            hasBackdrop: false,\n        });\n    }\n\n    public closePopover() {\n        this.overlayRef && this.overlayRef.close();\n        this.overlayRef = null;\n    }\n\n    public togglePopover() {\n        if (this.overlayRef) {\n            this.closePopover();\n        } else {\n            this.openPopover();\n        }\n    }\n}\n","<material-navbar\n  menuPosition=\"dashboard-navbar\"\n  [showToggleButton]=\"true\"\n  (toggleButtonClick)=\"sidenav.toggleSidebarMode()\"\n>\n  <workspace-selector></workspace-selector>\n</material-navbar>\n\n<sidenav>\n  <nav>\n    <custom-menu\n      position=\"dashboard-sidebar\"\n      [vertical]=\"true\"\n      [compact]=\"sidenav.isCompact$ | async\"\n      class=\"vertical\"\n    ></custom-menu>\n    <upgrade-panel [compact]=\"sidenav.isCompact$ | async\"></upgrade-panel>\n  </nav>\n\n  <main>\n    <ad-host slot=\"ads.dashboard.top\"></ad-host>\n    <div class=\"dashboard-page\">\n      <router-outlet (activate)=\"onPageChange($event)\" ></router-outlet>\n    </div>\n    <app-footer *ngIf=\"settings.get('links.dash_footer')\"></app-footer>\n  </main>\n</sidenav>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n    ViewChild,\n} from '@angular/core';\nimport {skip} from 'rxjs/operators';\nimport {ValueLists} from '@common/core/services/value-lists.service';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {LinkUsageService} from '../../shared/link/link-usage.service';\nimport {Subscription} from 'rxjs';\nimport {Settings} from '@common/core/config/settings.service';\nimport {NotificationService} from '@common/notifications/notification-list/notification.service';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {SidenavComponent} from '@common/shared/sidenav/sidenav.component';\n\ninterface DatatableComponent {\n    datatable?: DatatableService<any>;\n}\n\n@Component({\n    selector: 'dashboard-host',\n    templateUrl: './dashboard-host.component.html',\n    styleUrls: ['./dashboard-host.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [ValueLists],\n})\nexport class DashboardHostComponent implements OnInit, OnDestroy {\n    @ViewChild(SidenavComponent, {static: true}) sidenav: SidenavComponent;\n    private activePage: DatatableComponent;\n    private subscriptions: Subscription[] = [];\n\n    constructor(\n        private linkUsage: LinkUsageService,\n        public settings: Settings,\n        private notifications: NotificationService,\n        private workspaces: WorkspacesService,\n    ) {}\n\n    ngOnInit() {\n        this.bindToNotificationClick();\n        this.bindToWorkspaceChange();\n    }\n\n    ngOnDestroy() {\n        this.subscriptions.forEach(s => s.unsubscribe());\n        this.subscriptions = [];\n    }\n\n    onPageChange(component: DatatableComponent) {\n        this.activePage = component;\n    }\n\n    private bindToWorkspaceChange() {\n        const sub = this.workspaces.activeId$\n            .pipe(skip(1))\n            .subscribe(() => {\n                this.activePage.datatable?.reset();\n                this.linkUsage.reload();\n            });\n        this.subscriptions.push(sub);\n    }\n\n    private bindToNotificationClick() {\n        const sub = this.workspaces.bindToNotificationClick();\n        this.subscriptions.push(sub);\n    }\n}\n","import {Injectable} from '@angular/core';\r\nimport {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';\r\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\r\nimport {catchError, mergeMap} from 'rxjs/operators';\r\nimport {EMPTY, Observable, of} from 'rxjs';\r\nimport {LinkService, LinkStats} from './link.service';\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class LinkReportsResolverService implements Resolve<Observable<LinkStats>> {\r\n    constructor(\r\n        private router: Router,\r\n        private http: AppHttpClient,\r\n        private link: LinkService,\r\n    ) {}\r\n\r\n    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<LinkStats> {\r\n        return this.link.getCurrentUserReports().pipe(\r\n            catchError(() => {\r\n                this.router.navigate(['/dashboard']);\r\n                return EMPTY;\r\n            }),\r\n            mergeMap(response => {\r\n                if (response) {\r\n                    return of(response.analytics);\r\n                } else {\r\n                    this.router.navigate(['/dashboard']);\r\n                    return EMPTY;\r\n                }\r\n            })\r\n        );\r\n    }\r\n}\r\n\r\n","import {\n    Component,\n    OnInit,\n    ChangeDetectionStrategy,\n    OnDestroy,\n} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\nimport {LinkService, LinkStats} from '../../shared/link/link.service';\nimport {BehaviorSubject, Subscription} from 'rxjs';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {skip} from 'rxjs/operators';\n\n@Component({\n    selector: 'dashboard-home',\n    templateUrl: './dashboard-home.component.html',\n    styleUrls: ['./dashboard-home.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DashboardHomeComponent implements OnInit, OnDestroy {\n    public reports$ = new BehaviorSubject<LinkStats>(null);\n    private workspaceSub: Subscription;\n\n    constructor(\n        private route: ActivatedRoute,\n        private workspaces: WorkspacesService,\n        private links: LinkService\n    ) {}\n\n    ngOnInit() {\n        this.route.data.subscribe((data: {reports: LinkStats}) => {\n            this.reports$.next(data.reports);\n        });\n\n        this.workspaceSub = this.workspaces.activeId$\n            .pipe(skip(1))\n            .subscribe(() => {\n                this.links.getCurrentUserReports().subscribe(response => {\n                    this.reports$.next(response.analytics);\n                });\n            });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n}\n","<click-charts [reports]=\"reports$ | async\"></click-charts>","<div class=\"datatable-page-header\">\n  <h1 trans>Custom Domains</h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"domains\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <permission-aware-button permission=\"custom_domains.create\">\n        <button\n          mat-raised-button\n          color=\"accent\"\n          (click)=\"showCrupdateDomainModal()\"\n          class=\"button-with-icon\"\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>Connect New Domain</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Host</th>\n        <th *ngIf=\"showUserColumn()\" table-sort-header=\"user_id\" trans>Owner</th>\n        <th table-sort-header=\"updated_at\" trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"5\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'domain(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <permission-aware-button permission=\"custom_domains.delete\">\n              <button\n                type=\"button\"\n                mat-raised-button\n                color=\"warn\"\n                (click)=\"maybeDeleteSelectedDomains()\"\n                trans\n              >\n                Delete\n              </button>\n            </permission-aware-button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let domain of domains$ | async\">\n        <td [table-body-checkbox]=\"domain.id\"></td>\n        <td data-label=\"Host\">\n          <img class=\"favicon-img\" [src]=\"domain.host | favicon\" alt=\"\" />\n          <span>{{ domain.host }}</span>\n        </td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"domain.user\"></user-column>\n        </td>\n        <td data-label=\"Updated At\">{{ domain.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <permission-aware-button\n            permission=\"custom_domains.update\"\n            [userOwnsResource]=\"currentUser.get('id') === domain.user_id\"\n          >\n            <button\n              mat-icon-button\n              (click)=\"showCrupdateDomainModal(domain)\"\n              [matTooltip]=\"'Edit domain' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <permission-aware-button permission=\"custom_domains.delete\" class=\"visible-on-mobile\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              (click)=\"maybeDeleteSelectedDomains([domain.id])\"\n              trans\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </permission-aware-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"custom-domain.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No custom domains have been added yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {CustomDomainIndexComponent} from '@common/custom-domain/custom-domain-index/custom-domain-index.component';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {CustomDomain} from '@common/custom-domain/custom-domain';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {CustomDomainService} from '@common/custom-domain/custom-domain.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {ActiveAppSectionService} from '../active-app-section.service';\nimport {Subscription} from 'rxjs';\nimport {CUSTOM_DOMAIN_FILTERS} from '@common/custom-domain/custom-domain-index/custom-domain-filters';\n\n@Component({\n    selector: 'link-domain',\n    templateUrl: './link-domain.component.html',\n    styleUrls: ['./link-domain.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class LinkDomainComponent\n    extends CustomDomainIndexComponent\n    implements OnInit, OnDestroy\n{\n    private workspaceSub: Subscription;\n\n    constructor(\n        public datatable: DatatableService<CustomDomain>,\n        public currentUser: CurrentUser,\n        protected customDomains: CustomDomainService,\n        protected toast: Toast,\n        protected router: Router,\n        protected route: ActivatedRoute,\n        private workspaces: WorkspacesService,\n        private activeSection: ActiveAppSectionService\n    ) {\n        super(datatable, currentUser, customDomains, toast, router);\n    }\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: CustomDomainService.BASE_URI,\n            staticParams: {\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = CUSTOM_DOMAIN_FILTERS.filter(\n            f =>\n                (f.key !== 'user_id' || this.showUserColumn()) &&\n                f.key !== 'global'\n        );\n    }\n}\n\n","<div class=\"datatable-page-header\">\n  <h1 trans>\n    <span trans>Link Pages</span>\n  </h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"pages\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <permission-aware-button permission=\"custom_pages.create\">\n        <button mat-raised-button color=\"accent\" routerLink=\"new\" class=\"button-with-icon\">\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>Add New Page</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Slug</th>\n        <th *ngIf=\"showUserColumn()\" table-sort-header trans>Owner</th>\n        <th class=\"body-column\" trans>Body</th>\n        <th class=\"type-column\" table-sort-header *ngIf=\"!endpoint\" trans>Type</th>\n        <th trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"7\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'page(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <button\n              type=\"button\"\n              mat-raised-button\n              color=\"warn\"\n              (click)=\"maybeDeleteSelectedPages()\"\n              trans\n            >\n              Delete\n            </button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let page of pages$ | async\">\n        <td [table-body-checkbox]=\"page.id\"></td>\n        <td data-label=\"Slug\">\n          <a [href]=\"getPageUrl(page)\" target=\"_blank\">{{ page.slug }}</a>\n        </td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"page.user\"></user-column>\n        </td>\n        <td data-label=\"Body\" class=\"body-column\">{{ page.body }}</td>\n        <td data-label=\"Type\" class=\"type-column\" *ngIf=\"!endpoint\">\n          {{ page.type ? viewName(page.type) : 'default' }}\n        </td>\n        <td data-label=\"Last Updated\">{{ page.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <permission-aware-button\n            permission=\"custom_pages.update\"\n            [userOwnsResource]=\"page.user_id === this.currentUser.get('id')\"\n          >\n            <button\n              [routerLink]=\"[page.id, 'edit']\"\n              mat-icon-button\n              [matTooltip]=\"'Edit page' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <permission-aware-button permission=\"custom_pages.delete\" class=\"visible-on-mobile\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              (click)=\"maybeDeleteSelectedPages([page.id])\"\n              trans\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </permission-aware-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"custom-page.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No pages have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {CustomPagesIndexComponent} from '@common/pages/custom-pages-index/custom-pages-index.component';\nimport {Settings} from '@common/core/config/settings.service';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {CustomPage} from '@common/core/types/models/CustomPage';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Pages} from '@common/pages/shared/pages.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {LINK_PAGE_BASE_URI} from '../link-page-base-uri';\nimport {CUSTOM_PAGE_FILTERS} from '@common/pages/custom-pages-index/cusomt-page-filters';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {ActiveAppSectionService} from '../active-app-section.service';\nimport {Subscription} from 'rxjs';\n\n@Component({\n    selector: 'link-page-index',\n    templateUrl: './link-page-index.component.html',\n    styleUrls: ['./link-page-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class LinkPageIndexComponent\n    extends CustomPagesIndexComponent\n    implements OnInit, OnDestroy\n{\n    private workspaceSub: Subscription;\n\n    constructor(\n        public settings: Settings,\n        public datatable: DatatableService<CustomPage>,\n        public currentUser: CurrentUser,\n        protected customPages: Pages,\n        protected toast: Toast,\n        protected router: Router,\n        protected route: ActivatedRoute,\n        private workspaces: WorkspacesService,\n        private activeSection: ActiveAppSectionService\n    ) {\n        super(\n            settings,\n            datatable,\n            currentUser,\n            customPages,\n            toast,\n            router,\n            route\n        );\n    }\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: LINK_PAGE_BASE_URI,\n            staticParams: {\n                with: ['user'],\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = CUSTOM_PAGE_FILTERS.filter(\n            f => f.key !== 'user_id' || this.showUserColumn()\n        );\n    }\n}\n","export const LINK_PAGE_BASE_URI = 'link-page';\n","import {Injectable} from '@angular/core';\nimport {\n    ActivatedRouteSnapshot,\n    CanActivate,\n    CanActivateChild,\n    CanLoad,\n    Route,\n    Router,\n    RouterStateSnapshot,\n} from '@angular/router';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {ONBOARDING_LOCAL_STORAGE_KEY} from '@common/billing/upgrade-page/upgrade-page.component';\nimport {LocalStorage} from '@common/core/services/local-storage.service';\nimport { WorkspacesService } from '@common/workspaces/workspaces.service';\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class RedirectToOnboardingGuard\n    implements CanActivate, CanActivateChild, CanLoad\n{\n    constructor(\n        private currentUser: CurrentUser,\n        private router: Router,\n        private workspaces: WorkspacesService,\n        private localStorage: LocalStorage\n    ) {}\n\n    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n        return this.handle();\n    }\n\n    canActivateChild(\n        route: ActivatedRouteSnapshot,\n        state: RouterStateSnapshot\n    ) {\n        return this.handle();\n    }\n\n    canLoad(route: Route) {\n        return this.handle();\n    }\n\n    private handle() {\n        if (\n            this.currentUser.isLoggedIn() &&\n            !this.currentUser.isSubscribed() &&\n            !this.workspaces.activeId$.value &&\n            this.localStorage.get(ONBOARDING_LOCAL_STORAGE_KEY)\n        ) {\n            // only redirect to onboarding page once, after initial registration\n            this.localStorage.remove(ONBOARDING_LOCAL_STORAGE_KEY);\n            this.router.navigate(['/billing/upgrade']);\n            return false;\n        }\n\n        return true;\n    }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface WorkspaceConfig {\n    description: string;\n}\n\nexport const WORKSPACE_CONFIG = new InjectionToken<WorkspaceConfig>('WORKSPACE_CONFIG');\n","<div class=\"datatable-page-header\">\n    <h1 trans>\n        <span trans>Workspaces</span>\n        <info-popover>\n            <strong trans>Workspaces and Teammates</strong>\n            <p trans>{{ workspaceConfig.description }}</p>\n        </info-popover>\n    </h1>\n\n    <div class=\"header\">\n        <datatable-filters pluralName=\"workspaces\"></datatable-filters>\n        <div class=\"action-buttons\">\n            <button\n              *ngIf=\"currentUser.hasPermission('workspaces.create')\"\n              mat-raised-button\n              color=\"accent\"\n              class=\"button-with-icon\"\n              (click)=\"showCrupdateWorkspaceModal()\"\n            >\n                <mat-icon svgIcon=\"add\"></mat-icon>\n                <span trans>Add New Workspace</span>\n            </button>\n        </div>\n    </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-sort-header trans>Name</th>\n        <th table-sort-header=\"owner_id\" trans>Owner</th>\n        <th trans>Your Role</th>\n        <th table-sort-header=\"members_count\" trans>Members</th>\n        <th trans>Last Updated</th>\n        <th></th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let workspace of workspaces$ | async\">\n        <td data-label=\"Name\">{{ workspace.name }}</td>\n        <td data-label=\"Owner\">\n          <user-column [user]=\"workspace.owner\"></user-column>\n        </td>\n        <td data-label=\"Your Role\" trans>{{ workspace.currentUser?.role_name || '-' }}</td>\n        <td data-label=\"Members\">{{ workspace.members_count || '-' }}</td>\n        <td data-label=\"Last Updated\">{{ workspace.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <button\n            mat-icon-button\n            (click)=\"openWorkspaceMembersModal(workspace)\"\n            [matTooltip]=\"'Manage Members' | trans\"\n          >\n            <mat-icon svgIcon=\"group-add\"></mat-icon>\n          </button>\n          <ng-container *ngIf=\"workspace.owner_id === this.currentUser.get('id')\">\n            <button\n              mat-icon-button\n              (click)=\"showCrupdateWorkspaceModal(workspace)\"\n              [matTooltip]=\"'Edit workspace' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n            <button\n              mat-icon-button\n              (click)=\"maybeDeleteWorkspace(workspace)\"\n              [matTooltip]=\"'Delete workspace' | trans\"\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </ng-container>\n          <ng-container *ngIf=\"workspace.owner_id !== this.currentUser.get('id')\">\n            <button\n              mat-icon-button\n              (click)=\"maybeLeaveWorkspace(workspace)\"\n              [matTooltip]=\"'Leave workspace' | trans\"\n            >\n              <mat-icon svgIcon=\"exit-to-app\"></mat-icon>\n            </button>\n          </ng-container>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message\n    svgImage=\"shared-workspace.svg\"\n    *ngIf=\"datatable.paginator.noResults$ | async\"\n  >\n    <span primary-text trans>No workspaces have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {Router} from '@angular/router';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {WorkspacesService} from '../workspaces.service';\nimport {Workspace} from '../types/workspace';\nimport {CrupdateWorkspaceModalComponent} from '../crupdate-workspace-modal/crupdate-workspace-modal.component';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {ManageWorkspaceMembersModalComponent} from '../manage-workspace-members-modal/manage-workspace-members-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Observable} from 'rxjs';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {LEAVE_WORKSPACE_CONFIRMATION} from '../leave-workspace-confirmation';\nimport { WORKSPACE_CONFIG, WorkspaceConfig } from '../workspace-config';\n\n@Component({\n    selector: 'workspace-index',\n    templateUrl: './workspace-index.component.html',\n    styleUrls: ['./workspace-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class WorkspaceIndexComponent implements OnInit {\n    public workspaces$ = this.datatable.data$ as Observable<Workspace[]>;\n    constructor(\n        public datatable: DatatableService<Workspace>,\n        public currentUser: CurrentUser,\n        private workspaces: WorkspacesService,\n        private toast: Toast,\n        private router: Router,\n        private modal: Modal,\n        @Inject(WORKSPACE_CONFIG) public workspaceConfig: WorkspaceConfig,\n    ) {}\n\n    ngOnInit() {\n        this.datatable.init({\n            uri: WorkspacesService.BASE_URI,\n            staticParams: {\n                userId: this.currentUser.get('id'),\n            }\n        });\n    }\n\n    public maybeDeleteWorkspace(workspace: Workspace) {\n        this.datatable.confirmResourceDeletion('workspace')\n            .subscribe(() => {\n                this.workspaces.delete([workspace.id]).subscribe(() => {\n                    this.datatable.reset();\n                    this.toast.open('Workspace deleted.');\n                }, (errResponse: BackendErrorResponse) => {\n                    this.toast.open(errResponse.message || HttpErrors.Default);\n                });\n            });\n    }\n\n    public showCrupdateWorkspaceModal(workspace?: Workspace) {\n        this.datatable.openCrupdateResourceModal(CrupdateWorkspaceModalComponent, {workspace})\n            .subscribe();\n    }\n\n    public openWorkspaceMembersModal(workspace: Workspace) {\n        this.modal.open(ManageWorkspaceMembersModalComponent, {workspace});\n    }\n\n    public filterByUser(): boolean {\n        return this.router.url.indexOf('admin') === -1;\n    }\n\n    public maybeLeaveWorkspace(workspace: Workspace) {\n        this.modal.open(ConfirmModalComponent, LEAVE_WORKSPACE_CONFIRMATION)\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (confirmed) {\n                    this.workspaces.deleteMember(workspace.id, this.currentUser.get('id'))\n                        .subscribe(() => this.datatable.reset());\n                }\n            });\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {RouterModule, Routes} from '@angular/router';\nimport {DashboardHostComponent} from './dashboard-host/dashboard-host.component';\nimport {LinkIndexComponent} from './link/link-index/link-index.component';\nimport {LinkShowComponent} from './link/link-show/link-show.component';\nimport {LinkShowResolverService} from './link/link-show/link-show-resolver.service';\nimport {LinkReportsResolverService} from '../shared/link/link-reports-resolver.service';\nimport {DashboardHomeComponent} from './dashboard-home/dashboard-home.component';\nimport {LinkGroupIndexComponent} from './link-group/link-group-index/link-group-index.component';\nimport {LinkGroupAnalyticsPageComponent} from './link-group/link-group-analytics-page/link-group-analytics-page.component';\nimport {LinkOverlayIndexComponent} from './link-overlay/link-overlay-index/link-overlay-index.component';\nimport {TrackingPixelIndexComponent} from './pixels/tracking-pixel-index/tracking-pixel-index.component';\nimport {CrupdateCustomPageComponent} from '@common/pages/custom-pages-index/crupdate-custom-page/crupdate-custom-page.component';\nimport {LINK_PAGE_BASE_URI} from './link-page-base-uri';\nimport {LinkDomainComponent} from './link-domain/link-domain.component';\nimport {CrupdateLinkOverlayPageComponent} from './link-overlay/link-overlay-index/crupdate-link-overlay-page/crupdate-link-overlay-page.component';\nimport {LinkGroupLinksIndexComponent} from './link-group/link-groups-links-index/link-group-links-index.component';\nimport {LinkPageIndexComponent} from './link-page-index/link-page-index.component';\nimport {PendingChangesGuard} from '@common/guards/pending-changes/pending-changes-guard.service';\nimport {RedirectToOnboardingGuard} from './dashboard-host/redirect-to-onboarding.guard';\nimport {WorkspaceIndexComponent} from '@common/workspaces/workspace-index/workspace-index.component';\nimport {BiolinkIndexComponent} from './biolinks/biolink-index/biolink-index.component';\nimport { BiolinkEditorComponent } from './biolinks/biolink-editor/biolink-editor.component';\n\nconst routes: Routes = [\n    {\n        path: '',\n        component: DashboardHostComponent,\n        canActivate: [RedirectToOnboardingGuard],\n        children: [\n            {\n                path: '',\n                resolve: {reports: LinkReportsResolverService},\n                component: DashboardHomeComponent,\n                data: {name: 'Dashboard'},\n            },\n\n            // link\n            {\n                path: 'links',\n                component: LinkIndexComponent,\n            },\n            {\n                path: 'links/:linkId',\n                resolve: {api: LinkShowResolverService},\n                component: LinkShowComponent,\n                data: {name: 'Link Statistics'},\n            },\n\n            // biolinks\n            {\n                path: 'biolinks',\n                component: BiolinkIndexComponent,\n            },\n            {\n                path: 'biolinks/:linkId/edit',\n                component: BiolinkEditorComponent,\n                data: {name: 'Edit Bio Link'},\n            },\n            {\n                path: 'biolinks/:biolinkId/analytics',\n                component: LinkGroupAnalyticsPageComponent,\n                data: {name: 'Biolink Statistics'},\n            },\n\n            // group\n            {\n                path: 'link-groups',\n                component: LinkGroupIndexComponent,\n            },\n            {\n                path: 'link-groups/:groupId/links',\n                component: LinkGroupLinksIndexComponent,\n            },\n            {\n                path: 'link-groups/:groupId/analytics',\n                component: LinkGroupAnalyticsPageComponent,\n                data: {name: 'Link Group Statistics'},\n            },\n\n            // custom domain\n            {\n                path: 'custom-domains',\n                component: LinkDomainComponent,\n                data: {name: 'Custom Domains'},\n            },\n\n            // link overlay\n            {\n                path: 'link-overlays',\n                component: LinkOverlayIndexComponent,\n                data: {name: 'Link Overlays'},\n            },\n            {\n                path: 'link-overlays/new',\n                component: CrupdateLinkOverlayPageComponent,\n                canDeactivate: [PendingChangesGuard],\n            },\n            {\n                path: 'link-overlays/edit/:id',\n                component: CrupdateLinkOverlayPageComponent,\n                canDeactivate: [PendingChangesGuard],\n            },\n\n            // tracking pixels\n            {\n                path: 'pixels',\n                component: TrackingPixelIndexComponent,\n                data: {name: 'Tracking Pixels'},\n            },\n\n            // workspaces\n            {\n                path: 'workspaces',\n                component: WorkspaceIndexComponent,\n                data: {name: 'Workspaces'},\n            },\n\n            // link pages\n            {\n                path: 'link-pages',\n                component: LinkPageIndexComponent,\n                data: {\n                    name: 'Link Pages',\n                    endpoint: LINK_PAGE_BASE_URI,\n                },\n            },\n            {\n                path: 'link-pages/new',\n                component: CrupdateCustomPageComponent,\n                data: {\n                    name: 'Add New Page',\n                    hideSlug: true,\n                    endpoint: LINK_PAGE_BASE_URI,\n                },\n            },\n            {\n                path: 'link-pages/:id/edit',\n                component: CrupdateCustomPageComponent,\n                data: {\n                    name: 'Edit Page',\n                    hideSlug: true,\n                    endpoint: LINK_PAGE_BASE_URI,\n                },\n            },\n        ],\n    },\n];\n\n@NgModule({\n    imports: [RouterModule.forChild(routes)],\n    exports: [RouterModule],\n})\nexport class DashboardRoutingModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {CustomDomainIndexComponent} from '@common/custom-domain/custom-domain-index/custom-domain-index.component';\nimport {CrupdateCustomDomainModalComponent} from '@common/custom-domain/crupdate-custom-domain-modal/crupdate-custom-domain-modal.component';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {NoResultsMessageModule} from '@common/core/ui/no-results-message/no-results-message.module';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {DatatableModule} from '../datatable/datatable.module';\nimport {LoadingIndicatorModule} from '../core/ui/loading-indicator/loading-indicator.module';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n@NgModule({\n    declarations: [\n        CustomDomainIndexComponent,\n        CrupdateCustomDomainModalComponent,\n    ],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        NoResultsMessageModule,\n        FormatPipesModule,\n        FormsModule,\n        ReactiveFormsModule,\n        DatatableModule,\n        LoadingIndicatorModule,\n\n        // material\n        MatIconModule,\n        MatButtonModule,\n        MatTooltipModule,\n        MatDialogModule,\n        MatSlideToggleModule,\n        MatProgressBarModule,\n    ],\n    exports: [\n        CrupdateCustomDomainModalComponent,\n    ]\n})\nexport class CustomDomainModule {}\n","<mat-menu #rootMenu>\n    <div mat-menu-item class=\"multiline-mat-menu-item\" (click)=\"selectValue('direct')\" [class.active]=\"value === 'direct'\">\n        <div class=\"title\" trans>Direct</div>\n        <div class=\"description\" trans>Redirect user to url instantly.</div>\n    </div>\n    <div mat-menu-item class=\"multiline-mat-menu-item\" (click)=\"selectValue('frame')\" [class.active]=\"value === 'frame'\">\n        <div class=\"title\" trans>Frame</div>\n        <div class=\"description\" trans [transValues]=\"{siteName: settings.get('branding.site_name')}\">Show url inside iframe with :siteName navigation bar.</div>\n    </div>\n    <div mat-menu-item class=\"multiline-mat-menu-item\" (click)=\"selectValue('splash')\" [class.active]=\"value === 'splash'\">\n        <div class=\"title\" trans>Splash</div>\n        <div class=\"description\" trans>Show splash page with optional ads and redirect user to url after a delay.</div>\n    </div>\n    <div mat-menu-item class=\"multiline-mat-menu-item\" [matMenuTriggerFor]=\"customPagesMenu\" [class.hidden]=\"!linkOptions?.pages.length\" [class.active]=\"value.includes('page')\">\n        <div class=\"title\" trans>Link Page</div>\n        <div class=\"description\" [transValues]=\"{siteName: settings.get('branding.site_name')}\" trans>Show specified link page with :siteName navigation bar and button to open long url.</div>\n    </div>\n    <div mat-menu-item class=\"multiline-mat-menu-item\" [matMenuTriggerFor]=\"overlayMenu\" [class.hidden]=\"!linkOptions?.overlays.length\" [class.active]=\"value.includes('overlay')\">\n        <div class=\"title\" trans>Overlay</div>\n        <div class=\"description\" trans>Redirect user instantly and show specified overlay over the link.</div>\n    </div>\n</mat-menu>\n\n<mat-menu #customPagesMenu>\n    <button mat-menu-item *ngFor=\"let page of linkOptions?.pages\" (click)=\"selectValue('page:' + page.id)\" [class.active]=\"value === 'page:' + page.id\">{{page.title}}</button>\n</mat-menu>\n\n<mat-menu #overlayMenu>\n    <button mat-menu-item *ngFor=\"let overlay of linkOptions?.overlays\"  (click)=\"selectValue('overlay:' + overlay.id)\" [class.active]=\"value === 'overlay:' + overlay.id\">{{overlay.name}}</button>\n</mat-menu>\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild} from '@angular/core';\nimport { MatMenu } from '@angular/material/menu';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {LinkType} from '../../../shared/link/link';\nimport {LinkOptionsList} from '../types';\nimport {Settings} from '@common/core/config/settings.service';\n\n@Component({\n    selector: 'link-type-menu',\n    templateUrl: './link-type-menu.component.html',\n    styleUrls: ['./link-type-menu.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: LinkTypeMenuComponent,\n        multi: true,\n    }]\n})\nexport class LinkTypeMenuComponent implements ControlValueAccessor {\n    @ViewChild('rootMenu', {static: true}) matMenu: MatMenu;\n    @Input() linkOptions: LinkOptionsList;\n    public value: string;\n    private propagateChange: Function;\n\n    constructor(\n        private cd: ChangeDetectorRef,\n        public settings: Settings,\n    ) {}\n\n    public writeValue(value: string) {\n        this.value = value;\n        this.cd.detectChanges();\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n\n    public selectValue(value: LinkType|string) {\n        this.value = value;\n        this.propagateChange(value);\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {DatetimeInputComponent} from './datetime-input.component';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport { MatButtonModule } from '@angular/material/button';\n\n@NgModule({\n    declarations: [DatetimeInputComponent],\n    imports: [\n        CommonModule,\n        ReactiveFormsModule,\n        TranslationsModule,\n\n        MatButtonModule,\n    ],\n    exports: [\n        DatetimeInputComponent,\n    ]\n})\nexport class DatetimeInputModule {\n}\n","import { Directive, ElementRef, EventEmitter, OnDestroy, OnInit, Output, Renderer2 } from '@angular/core';\nimport { fromEvent, Subscription } from 'rxjs';\n\n@Directive({\n    selector: '[enterKeybind]',\n})\nexport class EnterKeybindDirective implements OnInit, OnDestroy {\n    @Output() enterPressed = new EventEmitter();\n    private subscription: Subscription;\n\n    constructor(private el: ElementRef) {}\n\n    ngOnInit() {\n        this.subscription = fromEvent(\n            this.el.nativeElement,\n            'keydown'\n        ).subscribe((e: KeyboardEvent) => {\n            if (e.keyCode === 13) {\n                e.preventDefault();\n                e.stopPropagation();\n                this.el.nativeElement.blur();\n                this.enterPressed.emit(e);\n            }\n        });\n    }\n\n    ngOnDestroy() {\n        this.subscription.unsubscribe();\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkspaceSelectorComponent } from './workspace-selector.component';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslationsModule } from '../../core/translations/translations.module';\nimport { MatButtonModule } from '@angular/material/button';\n\n\n\n@NgModule({\n  declarations: [\n      WorkspaceSelectorComponent,\n  ],\n  imports: [\n      CommonModule,\n      TranslationsModule,\n\n      // material\n      MatMenuModule,\n      MatButtonModule,\n      MatIconModule,\n  ],\n  exports: [\n      WorkspaceSelectorComponent,\n  ]\n})\nexport class WorkspaceSelectorModule { }\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {GoogleFontSelectorComponent} from '@common/shared/form-controls/google-font-selector/google-font-selector.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatRippleModule} from '@angular/material/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {FontDisplayNamePipe} from '@common/shared/form-controls/google-font-selector/font-display-name.pipe';\n\n@NgModule({\n    declarations: [GoogleFontSelectorComponent, FontDisplayNamePipe],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        ReactiveFormsModule,\n        FormsModule,\n        MatRippleModule,\n        MatButtonModule,\n        MatIconModule,\n    ],\n    exports: [GoogleFontSelectorComponent, FontDisplayNamePipe],\n})\nexport class GoogleFontSelectorModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {BackgroundSelectorComponent} from '@common/shared/form-controls/background-selector/background-selector.component';\nimport {MatRippleModule} from '@angular/material/core';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {LabelFromFilenamePipe} from '@common/shared/form-controls/background-selector/label-from-filename.pipe';\nimport {BackgroundSelectorImgComponent} from '@common/shared/form-controls/background-selector/background-selector-img/background-selector-img.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {BackgroundSelectorGradientComponent} from '@common/shared/form-controls/background-selector/background-selector-gradient/background-selector-gradient.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {BackgroundOverlayComponent} from '@common/shared/form-controls/background-selector/background-overlay/background-overlay.component';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatRadioModule} from '@angular/material/radio';\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\n\n@NgModule({\n    declarations: [\n        BackgroundSelectorComponent,\n        LabelFromFilenamePipe,\n        BackgroundSelectorImgComponent,\n        BackgroundSelectorGradientComponent,\n        BackgroundOverlayComponent,\n    ],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        MatRippleModule,\n        FormatPipesModule,\n        MatButtonModule,\n        MatIconModule,\n        ReactiveFormsModule,\n        MatRadioModule,\n        MatButtonToggleModule,\n    ],\n    exports: [BackgroundSelectorComponent, BackgroundOverlayComponent],\n})\nexport class BackgroundSelectorModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {LinkOptionsFormComponent} from './link-options-form.component';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {DatetimeInputModule} from '@common/core/ui/datetime-input/datetime-input.module';\nimport {PermissionAwareInputContainerComponent} from '../../permission-aware-input-container/permission-aware-input-container.component';\nimport {PermissionAwareButtonComponent} from '../../permissions/permission-aware-button/permission-aware-button.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { UploadImageControlModule } from '@common/shared/form-controls/upload-image-control/upload-image-control.module';\nimport { ChipsModule } from '@common/core/ui/chips/chips.module';\nimport { DomainFormControlComponent } from './domain-form-control/domain-form-control.component';\n\n@NgModule({\n    declarations: [\n        LinkOptionsFormComponent,\n        DomainFormControlComponent,\n        PermissionAwareInputContainerComponent,\n        PermissionAwareButtonComponent,\n    ],\n    imports: [\n        CommonModule,\n        ReactiveFormsModule,\n        TranslationsModule,\n        DatetimeInputModule,\n        UploadImageControlModule,\n        ChipsModule,\n\n        MatButtonModule,\n        MatIconModule,\n        MatFormFieldModule,\n        MatSelectModule,\n    ],\n    exports: [\n        LinkOptionsFormComponent,\n        PermissionAwareInputContainerComponent,\n        PermissionAwareButtonComponent,\n        DomainFormControlComponent\n    ],\n})\nexport class LinkOptionsFormModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {WidgetListModalComponent} from './widgets/widget-list-modal/widget-list-modal.component';\nimport {ImageWidgetModalComponent} from './widgets/image-widget-modal/image-widget-modal.component';\nimport {YoutubeWidgetModalComponent} from './widgets/youtube-widget-modal/youtube-widget-modal.component';\nimport {SoundcloudWidgetModalComponent} from './widgets/soundcloud-widget-modal/soundcloud-widget-modal.component';\nimport {VimeoWidgetModalComponent} from './widgets/vimeo-widget-modal/vimeo-widget-modal.component';\nimport {SpotifyWidgetModalComponent} from './widgets/spotify-widget-modal/spotify-widget-modal.component';\nimport {TwitchWidgetModalComponent} from './widgets/twitch-widget-modal/twitch-widget-modal.component';\nimport {TiktokWidgetModalComponent} from './widgets/tiktok-widget-modal/tiktok-widget-modal.component';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {NoResultsMessageModule} from '@common/core/ui/no-results-message/no-results-message.module';\nimport {SkeletonModule} from '@common/core/ui/skeleton/skeleton.module';\nimport {LinkPreviewModule} from '../../../shared/link-preview/link-preview.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {UploadImageControlModule} from '@common/shared/form-controls/upload-image-control/upload-image-control.module';\nimport {DragDropModule} from '@angular/cdk/drag-drop';\nimport {TextWidgetModalComponent} from './widgets/text-widget-modal/text-widget-modal.component';\nimport {SocialsWidgetModalComponent} from './widgets/socials-widget-modal/socials-widget-modal.component';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {MatRippleModule} from '@angular/material/core';\nimport {BiolinkEditorComponent} from './biolink-editor.component';\nimport {BiolinkEditorButtonsComponent} from './biolink-appearance/biolink-editor-buttons/biolink-editor-buttons.component';\nimport {ColorPickerInputModule} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.module';\nimport {BiolinkEditorFontsComponent} from './biolink-appearance/biolink-editor-fonts/biolink-editor-fonts.component';\nimport {GoogleFontSelectorModule} from '@common/shared/form-controls/google-font-selector/google-font-selector.module';\nimport {BiolinkAppearanceComponent} from './biolink-appearance/biolink-appearance.component';\nimport {BackgroundSelectorModule} from '@common/shared/form-controls/background-selector/background-selector.module';\nimport {BiolinkSettingsComponent} from './biolink-settings/biolink-settings.component';\nimport {LinkOptionsFormModule} from '../../link/link-options-form/link-options-form.module';\nimport {SlugControlModule} from '@common/shared/form-controls/slug-control/slug-control.module';\nimport {BiolinkEditorContentComponent} from './biolink-editor-content/biolink-editor-content.component';\nimport {SharedModule} from '../../../shared/shared.module';\nimport {RouterModule} from '@angular/router';\nimport {AnimationSelectorComponent} from './biolink-editor-content/biolink-editor-link/animation-selector/animation-selector.component';\nimport {BiolinkSlideoutPanelComponent} from './biolink-editor-content/biolink-slideout-panel/biolink-slideout-panel.component';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {BiolinkEditorLinkComponent} from './biolink-editor-content/biolink-editor-link/biolink-editor-link.component';\nimport {BiolinkEditorWidgetComponent} from './biolink-editor-content/biolink-editor-widget/biolink-editor-widget.component';\nimport {LeapLinkPanelComponent} from './biolink-editor-content/biolink-editor-link/leap-link-panel/leap-link-panel.component';\nimport {DatetimeInputModule} from '@common/core/ui/datetime-input/datetime-input.module';\nimport {ImageOrIconModule} from '@common/core/ui/image-or-icon/image-or-icon.module';\nimport { LinkThumbnailPanelComponent } from './biolink-editor-content/biolink-editor-link/link-thumbnail-panel/link-thumbnail-panel.component';\n\n@NgModule({\n    declarations: [\n        BiolinkEditorComponent,\n        WidgetListModalComponent,\n        ImageWidgetModalComponent,\n        YoutubeWidgetModalComponent,\n        SoundcloudWidgetModalComponent,\n        VimeoWidgetModalComponent,\n        SpotifyWidgetModalComponent,\n        TwitchWidgetModalComponent,\n        TiktokWidgetModalComponent,\n        TextWidgetModalComponent,\n        SocialsWidgetModalComponent,\n        BiolinkAppearanceComponent,\n        BiolinkEditorButtonsComponent,\n        BiolinkEditorFontsComponent,\n        BiolinkSettingsComponent,\n        BiolinkEditorContentComponent,\n        AnimationSelectorComponent,\n        BiolinkSlideoutPanelComponent,\n        BiolinkEditorLinkComponent,\n        BiolinkEditorWidgetComponent,\n        LeapLinkPanelComponent,\n        LinkThumbnailPanelComponent,\n    ],\n    imports: [\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n        RouterModule,\n        FormatPipesModule,\n        TranslationsModule,\n        NoResultsMessageModule,\n        SkeletonModule,\n        LinkPreviewModule,\n        UploadImageControlModule,\n        ColorPickerInputModule,\n        GoogleFontSelectorModule,\n        BackgroundSelectorModule,\n        LinkOptionsFormModule,\n        SlugControlModule,\n        SharedModule,\n        DatetimeInputModule,\n        ImageOrIconModule,\n\n        // material\n        MatIconModule,\n        MatButtonModule,\n        MatTooltipModule,\n        MatDialogModule,\n        DragDropModule,\n        MatTabsModule,\n        MatRippleModule,\n        MatSlideToggleModule,\n    ],\n})\nexport class BiolinkEditorModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {DashboardHostComponent} from './dashboard-host/dashboard-host.component';\nimport {DashboardRoutingModule} from './dashboard-routing.module';\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {RouterModule} from '@angular/router';\nimport {ChipsModule} from '@common/core/ui/chips/chips.module';\nimport {LinkIndexComponent} from './link/link-index/link-index.component';\nimport {CrupdateLinkModalComponent} from './link/crupdate-link-modal/crupdate-link-modal.component';\nimport {LinkShowComponent} from './link/link-show/link-show.component';\nimport {ChartsModule} from '@common/shared/charts/charts.module';\nimport {LinkGroupIndexComponent} from './link-group/link-group-index/link-group-index.component';\nimport {DashboardHomeComponent} from './dashboard-home/dashboard-home.component';\nimport {SharedModule} from '../shared/shared.module';\nimport {CrupdateLinkGroupModalComponent} from './link-group/crupdate-link-group-modal/crupdate-link-group-modal.component';\nimport {LinkGroupAnalyticsPageComponent} from './link-group/link-group-analytics-page/link-group-analytics-page.component';\nimport {AttachLinkModalComponent} from './link-group/attach-link-modal/attach-link-modal.component';\nimport {CustomDomainModule} from '@common/custom-domain/custom-domain.module';\nimport {LinkOverlayIndexComponent} from './link-overlay/link-overlay-index/link-overlay-index.component';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {LinkTypeMenuComponent} from './link/link-type-menu/link-type-menu.component';\nimport {DatetimeInputModule} from '@common/core/ui/datetime-input/datetime-input.module';\nimport {LinkUsageInfoComponent} from './dashboard-host/link-usage-info/link-usage-info.component';\nimport {UpgradePanelComponent} from './dashboard-host/upgrade-panel/upgrade-panel.component';\nimport {TrackingPixelIndexComponent} from './pixels/tracking-pixel-index/tracking-pixel-index.component';\nimport {CrupdateTrackingPixelModalComponent} from './pixels/crupdate-tracking-pixel-modal/crupdate-tracking-pixel-modal.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {ClickChartsModule} from './click-charts/click-charts.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule} from '@angular/material/button';\nimport {ColorPickerInputModule} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.module';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {NoResultsMessageModule} from '@common/core/ui/no-results-message/no-results-message.module';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {InfoPopoverModule} from '@common/core/ui/info-popover/info-popover.module';\nimport {MaterialNavbarModule} from '@common/core/ui/material-navbar/material-navbar.module';\nimport {AdHostModule} from '@common/core/ui/ad-host/ad-host.module';\nimport {SlugControlModule} from '@common/shared/form-controls/slug-control/slug-control.module';\nimport {MatRadioModule} from '@angular/material/radio';\nimport {DatatableModule} from '@common/datatable/datatable.module';\nimport {SelectUserInputModule} from '@common/core/ui/select-user-input/select-user-input.module';\nimport {RemoveProtocolPipe} from './link/link-index/remove-protocol.pipe';\nimport {NoPermissionMessageComponent} from './permissions/no-permission-message/no-permission-message.component';\nimport {SkeletonModule} from '@common/core/ui/skeleton/skeleton.module';\nimport {LinkDomainComponent} from './link-domain/link-domain.component';\nimport {LinkPageIndexComponent} from './link-page-index/link-page-index.component';\nimport {CustomPageIndexModule} from '@common/pages/custom-pages-index/custom-page-index.module';\nimport {CrupdateLinkOverlayPageComponent} from './link-overlay/link-overlay-index/crupdate-link-overlay-page/crupdate-link-overlay-page.component';\nimport {GenericPagePreviewComponent} from './link-overlay/link-overlay-index/crupdate-link-overlay-page/generic-page-preview/generic-page-preview.component';\nimport {LinkGroupLinksIndexComponent} from './link-group/link-groups-links-index/link-group-links-index.component';\nimport {CsvExportInfoDialogModule} from '@common/csv/csv-info-dialog/csv-export-info-dialog.module';\nimport {UploadImageControlModule} from '@common/shared/form-controls/upload-image-control/upload-image-control.module';\nimport {UtmBuilderDialogComponent} from './link/utm-builder-dialog/utm-builder-dialog.component';\nimport {EnterKeybindDirective} from '@common/core/ui/enter-keybind.directive';\nimport {SvgImageModule} from '@common/core/ui/svg-image/svg-image.module';\nimport {WorkspaceModule} from '@common/workspaces/workspace.module';\nimport {WorkspaceSelectorModule} from '@common/workspaces/workspace-selector/workspace-selector.module';\nimport {UpgradeOverlayComponent} from './permissions/upgrade-overlay/upgrade-overlay.component';\nimport {SimplePermissionOverlayComponent} from './permissions/simple-permission-overlay/simple-permission-overlay.component';\nimport {\n    WORKSPACE_CONFIG,\n    WorkspaceConfig,\n} from '@common/workspaces/workspace-config';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {LinkCreatedMessageComponent} from './link/crupdate-link-modal/link-created-message/link-created-message.component';\nimport {AppFooterModule} from '../shared/app-footer/app-footer.module';\nimport {BiolinkIndexComponent} from './biolinks/biolink-index/biolink-index.component';\nimport {ImageOrIconModule} from '@common/core/ui/image-or-icon/image-or-icon.module';\nimport {MatRippleModule} from '@angular/material/core';\nimport {BiolinkEditorModule} from './biolinks/biolink-editor/biolink-editor.module';\nimport {LinkOptionsFormModule} from './link/link-options-form/link-options-form.module';\nimport { SidenavModule } from '@common/shared/sidenav/sidenav.module';\n\n@NgModule({\n    declarations: [\n        DashboardHostComponent,\n        DashboardHomeComponent,\n        LinkIndexComponent,\n        CrupdateLinkModalComponent,\n        LinkShowComponent,\n        LinkGroupIndexComponent,\n        CrupdateLinkGroupModalComponent,\n        LinkGroupAnalyticsPageComponent,\n        AttachLinkModalComponent,\n        LinkOverlayIndexComponent,\n        LinkTypeMenuComponent,\n        LinkUsageInfoComponent,\n        UpgradePanelComponent,\n        TrackingPixelIndexComponent,\n        CrupdateTrackingPixelModalComponent,\n        EnterKeybindDirective,\n        RemoveProtocolPipe,\n        NoPermissionMessageComponent,\n        LinkDomainComponent,\n        LinkPageIndexComponent,\n        CrupdateLinkOverlayPageComponent,\n        GenericPagePreviewComponent,\n        LinkGroupLinksIndexComponent,\n        UtmBuilderDialogComponent,\n        UpgradeOverlayComponent,\n        SimplePermissionOverlayComponent,\n        LinkCreatedMessageComponent,\n        BiolinkIndexComponent,\n    ],\n    imports: [\n        CommonModule,\n        RouterModule,\n        DashboardRoutingModule,\n        TranslationsModule,\n        FormatPipesModule,\n        ClickChartsModule,\n        FormsModule,\n        ReactiveFormsModule,\n        ColorPickerInputModule,\n        LoadingIndicatorModule,\n        NoResultsMessageModule,\n        InfoPopoverModule,\n        MaterialNavbarModule,\n        AdHostModule,\n        SlugControlModule,\n        CsvExportInfoDialogModule,\n        UploadImageControlModule,\n        SvgImageModule,\n        AppFooterModule,\n        WorkspaceModule,\n        WorkspaceSelectorModule,\n        LinkOptionsFormModule,\n        SidenavModule,\n\n        SkeletonModule,\n\n        DatatableModule,\n        SelectUserInputModule,\n\n        SharedModule,\n        ChartsModule,\n        CustomDomainModule,\n        CustomPageIndexModule,\n        ChipsModule,\n        DatetimeInputModule,\n\n        BiolinkEditorModule,\n\n        // material\n        MatButtonModule,\n        MatIconModule,\n        MatTooltipModule,\n        MatDialogModule,\n        MatButtonToggleModule,\n        MatTabsModule,\n        MatMenuModule,\n        MatProgressBarModule,\n        MatSlideToggleModule,\n        MatRadioModule,\n        ImageOrIconModule,\n        MatRippleModule,\n    ],\n    exports: [\n        CrupdateLinkModalComponent,\n    ],\n    providers: [\n        Modal,\n        {\n            provide: WORKSPACE_CONFIG,\n            useValue: {\n                description:\n                    `Workspaces are like folders for your links, domains, groups and other resources. They're great for organising your campaigns, collaborating with teammates and managing different projects.`,\n            } as WorkspaceConfig,\n        },\n    ],\n})\nexport class DashboardModule {}\n","<div class=\"modal-header\">\n  <h2 class=\"capitalize\" mat-dialog-title>\n    <span trans *ngIf=\"!data.linkGroup\">Create {{ resourceName }}</span>\n    <span trans *ngIf=\"data.linkGroup\">Update {{ resourceName }}</span>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"confirm()\" ngNativeValidate [formGroup]=\"form\" *ngIf=\"errors$ | async as errors\">\n  <mat-dialog-content class=\"many-inputs\">\n    <div class=\"input-container name-container\">\n      <label for=\"link-group-name\" trans>Name</label>\n      <input type=\"text\" id=\"link-group-name\" formControlName=\"name\" required minlength=\"3\" />\n      <div class=\"error\" *ngIf=\"errors.name\">{{ errors.name }}</div>\n    </div>\n\n    <div class=\"input-container\">\n      <slug-control [baseUri]=\"slugBaseUri$ | async\" formControlName=\"hash\"></slug-control>\n      <div class=\"error\" *ngIf=\"errors.hash\">{{ errors.hash }}</div>\n    </div>\n\n    <domain-form-control\n      controlName=\"domain_id\"\n      [domains]=\"domains$ | async\"\n      class=\"many-inputs\"\n    ></domain-form-control>\n\n    <div class=\"input-container\">\n      <label for=\"link-group-description\" trans>Description</label>\n      <textarea id=\"link-group-description\" formControlName=\"description\"></textarea>\n    </div>\n\n    <div class=\"setting-toggle-container\">\n      <mat-slide-toggle class=\"capitalize\" formControlName=\"active\" id=\"link-group-active\" trans\n        >Active</mat-slide-toggle\n      >\n      <p trans>Whether this {{ resourceName }} is viewable publicly.</p>\n    </div>\n\n    <div class=\"setting-toggle-container\" *ngIf=\"data.type !== 'biolink'\">\n      <mat-slide-toggle formControlName=\"rotator\" id=\"link-group-rotator\" trans\n        >Rotator</mat-slide-toggle\n      >\n      <p trans>\n        When checked, url above will redirect to random link from the group, instead of showing all\n        links belonging to group.\n      </p>\n    </div>\n  </mat-dialog-content>\n\n  <mat-dialog-actions>\n    <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n    <button type=\"submit\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>\n      <span *ngIf=\"updating$ | async; else creating\">Update</span>\n      <ng-template #creating>\n        <span>Create</span>\n      </ng-template>\n    </button>\n  </mat-dialog-actions>\n</form>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    OnInit,\n} from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {Messages} from '../../../messages.enum';\nimport {LinkGroup} from '../../../shared/link/link-group';\nimport {LinkGroupService} from '../../../shared/link/link-group.service';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {finalize} from 'rxjs/operators';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {randomString} from '@common/core/utils/random-string';\nimport {ValueLists} from '@common/core/services/value-lists.service';\nimport {CustomDomain} from '@common/custom-domain/custom-domain';\nimport {Settings} from '@common/core/config/settings.service';\nimport {BiolinksService} from '../../biolinks/biolinks.service';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {Biolink} from '../../biolinks/biolink';\n\nexport interface CrupdateLinkGroupModalData {\n    linkGroup: LinkGroup;\n    type?: 'group' | 'biolink';\n}\n\n@Component({\n    selector: 'crupdate-link-group-modal',\n    templateUrl: './crupdate-link-group-modal.component.html',\n    styleUrls: ['./crupdate-link-group-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CrupdateLinkGroupModalComponent implements OnInit {\n    loading$ = new BehaviorSubject(false);\n    updating$ = new BehaviorSubject(false);\n    errors$ = new BehaviorSubject<Partial<LinkGroup>>({});\n    form = new FormGroup({\n        name: new FormControl(),\n        active: new FormControl(true),\n        description: new FormControl(''),\n        hash: new FormControl(randomString(6)),\n        rotator: new FormControl(false),\n        domain_id: new FormControl(null),\n    });\n    slugBaseUri$ = new BehaviorSubject<string>(null);\n    domains$ = new BehaviorSubject<CustomDomain[]>([]);\n\n    get resourceName(): string {\n        return this.data.type === 'biolink' ? 'biolink' : 'link group';\n    }\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateLinkGroupModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateLinkGroupModalData,\n        private groups: LinkGroupService,\n        private biolinks: BiolinksService,\n        private toast: Toast,\n        private valueLists: ValueLists,\n        private settings: Settings\n    ) {}\n\n    ngOnInit() {\n        this.updating$.next(!!this.data.linkGroup);\n        if (this.data.linkGroup) {\n            this.form.patchValue(this.data.linkGroup);\n        }\n\n        this.valueLists.get(['domains']).subscribe(response => {\n            this.domains$.next(response.domains);\n            this.setSlugBaseUri(this.form.value.domain_id);\n        });\n\n        this.form.get('domain_id').valueChanges.subscribe(domainId => {\n            this.setSlugBaseUri(domainId);\n        });\n    }\n\n    confirm() {\n        this.loading$.next(true);\n\n        const request: BackendResponse<{biolink?: Biolink; linkGroup?: LinkGroup}> =\n            this.updating$.value\n                ? this.api().update(this.data.linkGroup.id, this.form.value)\n                : this.api().create(this.form.value);\n\n        request.pipe(finalize(() => this.loading$.next(false))).subscribe(\n            response => {\n                this.toast.open(\n                    this.updating$.value\n                        ? `${this.resourceName} updated`\n                        : `${this.resourceName} created`\n                );\n                this.close(response.linkGroup || response.biolink);\n            },\n            (errResponse: BackendErrorResponse) =>\n                this.errors$.next(errResponse.errors)\n        );\n    }\n\n    close(group?: LinkGroup) {\n        this.dialogRef.close(group);\n    }\n\n    private api(): BiolinksService | LinkGroupService {\n        return this.data.type === 'biolink' ? this.biolinks : this.groups;\n    }\n\n    private setSlugBaseUri(domainId: number) {\n        if (domainId) {\n            this.slugBaseUri$.next(\n                this.domains$.value.find(d => d.id === domainId).host\n            );\n        } else {\n            this.slugBaseUri$.next(this.settings.getBaseUrl());\n        }\n    }\n}\n","<header>\n    <div *ngIf=\"linkGroup$ | async as linkGroup\" @fadeIn>\n        <h1 class=\"name\">\n            <a routerLink=\"../../\" mat-icon-button>\n                <mat-icon svgIcon=\"arrow-back\"></mat-icon>\n            </a>\n            {{linkGroup.name}} {{ 'Analytics' | trans }}\n        </h1>\n    </div>\n    <h1 *ngIf=\"!(linkGroup$ | async)\" @fadeOut>\n        <skeleton variant=\"text\"></skeleton>\n    </h1>\n</header>\n\n<click-charts [reports]=\"analytics$ | async\" [endpoint]=\"analyticsEndpoint\"></click-charts>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\nimport {LinkGroupService} from '../../../shared/link/link-group.service';\nimport {Subject} from 'rxjs';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {LinkStats} from '../../../shared/link/link.service';\nimport {LinkGroup} from '../../../shared/link/link-group';\nimport {SKELETON_ANIMATIONS} from '@common/core/ui/skeleton/skeleton-animations';\nimport { BiolinksService } from '../../biolinks/biolinks.service';\n\n@Component({\n    selector: 'link-group-analytics-page',\n    templateUrl: './link-group-analytics-page.component.html',\n    styleUrls: ['./link-group-analytics-page.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: SKELETON_ANIMATIONS,\n})\nexport class LinkGroupAnalyticsPageComponent implements OnInit {\n    public analytics$ = new Subject<LinkStats>();\n    public linkGroup$ = new Subject<LinkGroup>();\n    public analyticsEndpoint: string;\n\n    constructor(\n        public route: ActivatedRoute,\n        private modal: Modal,\n        private groups: LinkGroupService,\n        private biolinks: BiolinksService,\n    ) {}\n\n    ngOnInit() {\n        this.route.params.subscribe(params => {\n            const linkeableId = params.groupId || params.biolinkId;\n            const api = params.groupId ? this.groups : this.biolinks;\n            this.analyticsEndpoint = api.analyticsEndpoint(linkeableId);\n            (api.analytics(linkeableId) as any).subscribe(response => {\n                this.analytics$.next(response.analytics);\n                this.linkGroup$.next(response.linkGroup || response.biolink);\n            });\n        });\n    }\n}\n","import { FindUserModalComponent } from '@common/auth/find-user-modal/find-user-modal.component';\nimport {\n    DatatableFilter,\n    FilterControlType\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {\n    CreatedAtFilter,\n    UpdatedAtFilter\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\n\nexport const LINK_GROUP_INDEX_FILTERS: DatatableFilter[] = [\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'active',\n        label: 'status',\n        defaultValue: false,\n        description: 'Whether group is public or not',\n        options: [\n            {key: 'Disabled', value: false},\n            {key: 'Active', value: true},\n        ],\n    }),\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'rotator',\n        label: 'rotator',\n        defaultValue: false,\n        description: 'Whether group is used as link rotator',\n        options: [\n            {key: 'Yes', value: true},\n            {key: 'No', value: false},\n        ],\n    }),\n    new CreatedAtFilter({\n        description: 'Date link group was created',\n    }),\n    new UpdatedAtFilter({\n        description: 'Date link group was last updated',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'user_id',\n        label: 'User',\n        description: 'User group was created by',\n        component: FindUserModalComponent,\n    }),\n];\n","<div class=\"datatable-page-header\">\n  <h1>\n    <span trans>Link Groups</span>\n    <info-popover [wider]=\"true\">\n      <div class=\"title\" trans>Group links together to:</div>\n      <ul>\n        <li trans>Simplify multiple link management.</li>\n        <li trans>View statistics for a whole group instead of individual links.</li>\n        <li trans>Share all links in the group with one link.</li>\n        <li trans>And more.</li>\n      </ul>\n    </info-popover>\n  </h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"groups\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <permission-aware-button permission=\"link_groups.create\">\n        <button\n          mat-raised-button\n          color=\"accent\"\n          class=\"button-with-icon\"\n          (click)=\"showCrupdateGroupModal()\"\n          trans\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>Add New Group</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Name</th>\n        <th *ngIf=\"showUserColumn()\" table-sort-header=\"user_id\" trans>Owner</th>\n        <th table-sort-header=\"links_count\" trans>Links</th>\n        <th table-sort-header=\"active\" trans>Active</th>\n        <th table-sort-header=\"rotator\" trans>Rotator</th>\n        <th table-sort-header=\"updated_at\" trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"6\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'group(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <permission-aware-button permission=\"link_groups.delete\">\n              <button\n                type=\"button\"\n                mat-raised-button\n                color=\"warn\"\n                (click)=\"maybeDeleteSelectedGroups()\"\n                trans\n              >\n                Delete\n              </button>\n            </permission-aware-button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let group of groups$ | async\">\n        <td [table-body-checkbox]=\"group.id\"></td>\n        <td data-label=\"Name\">\n          <a class=\"link-group-name\" [routerLink]=\"['/', group.hash]\" target=\"_blank\">{{\n            group.name\n          }}</a>\n        </td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"group.user\"></user-column>\n        </td>\n        <td data-label=\"Link Count\">{{ group.links_count }}</td>\n        <td data-label=\"Active\">\n          <mat-icon svgIcon=\"check\" *ngIf=\"group.active\"></mat-icon>\n          <span *ngIf=\"!group.active\">-</span>\n        </td>\n        <td data-label=\"Rotator\">\n          <mat-icon svgIcon=\"check\" *ngIf=\"group.rotator\"></mat-icon>\n          <span *ngIf=\"!group.rotator\">-</span>\n        </td>\n        <td data-label=\"Last Updated\">{{ group.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <button\n            type=\"button\"\n            mat-icon-button\n            [routerLink]=\"[group.id, 'analytics']\"\n            [matTooltip]=\"'Analytics' | trans\"\n          >\n            <mat-icon svgIcon=\"bar-chart\"></mat-icon>\n          </button>\n          <permission-aware-button\n            permission=\"link_groups.update\"\n            [userOwnsResource]=\"currentUser.get('id') === group.user_id\"\n          >\n            <button\n              type=\"button\"\n              [routerLink]=\"[group.id, 'links']\"\n              mat-icon-button\n              [matTooltip]=\"'Manage Links' | trans\"\n            >\n              <mat-icon svgIcon=\"list-alt\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <permission-aware-button\n            permission=\"link_groups.update\"\n            [userOwnsResource]=\"currentUser.get('id') === group.user_id\"\n          >\n            <button\n              (click)=\"showCrupdateGroupModal(group)\"\n              mat-icon-button\n              [matTooltip]=\"'Edit' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <copy-link-btn [model]=\"group\"></copy-link-btn>\n          <permission-aware-button permission=\"link_groups.delete\" class=\"visible-on-mobile\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              (click)=\"maybeDeleteSelectedGroups([group.id])\"\n              trans\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </permission-aware-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"marketing.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No link groups have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute} from '@angular/router';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {LinkGroupService} from '../../../shared/link/link-group.service';\nimport {Messages} from '../../../messages.enum';\nimport {CrupdateLinkGroupModalComponent} from '../crupdate-link-group-modal/crupdate-link-group-modal.component';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {LinkGroup} from '../../../shared/link/link-group';\nimport {Observable, Subscription} from 'rxjs';\nimport {LINK_GROUP_INDEX_FILTERS} from './link-group-index-filters';\nimport {ActiveAppSectionService} from '../../active-app-section.service';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\n\n@Component({\n    selector: 'link-group-index',\n    templateUrl: './link-group-index.component.html',\n    styleUrls: ['./link-group-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class LinkGroupIndexComponent implements OnInit, OnDestroy {\n    groups$ = this.datatable.data$ as Observable<LinkGroup[]>;\n    filters = LINK_GROUP_INDEX_FILTERS;\n    private workspaceSub: Subscription;\n\n    constructor(\n        public datatable: DatatableService<LinkGroup>,\n        public currentUser: CurrentUser,\n        private linkGroups: LinkGroupService,\n        private toast: Toast,\n        private route: ActivatedRoute,\n        private linkUsage: LinkUsageService,\n        private activeSection: ActiveAppSectionService,\n        private workspaces: WorkspacesService\n    ) {}\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: LinkGroupService.BASE_URI,\n            staticParams: {\n                with: ['user'],\n                withCount: ['links'],\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    maybeDeleteSelectedGroups(groupIds?: number[]) {\n        this.datatable.confirmResourceDeletion('link groups').subscribe(() => {\n            this.linkGroups\n                .delete(groupIds || this.datatable.selectedRows$.value)\n                .subscribe(\n                    () => {\n                        this.datatable.reset();\n                        this.toast.open(Messages.LINK_GROUP_DELETE_SUCCESS);\n                    },\n                    (errResponse: BackendErrorResponse) => {\n                        this.toast.open(\n                            errResponse.message || HttpErrors.Default\n                        );\n                    }\n                );\n        });\n    }\n\n    showCrupdateGroupModal(linkGroup?: LinkGroup) {\n        this.datatable\n            .openCrupdateResourceModal(CrupdateLinkGroupModalComponent, {\n                linkGroup,\n            })\n            .subscribe(() => this.linkUsage.reload());\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = LINK_GROUP_INDEX_FILTERS.filter(\n            f => f.key !== 'user_id' || this.showUserColumn()\n        );\n    }\n}\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {LinkGroupService} from '../../../shared/link/link-group.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {Link} from '../../../shared/link/link';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {LinkService} from '../../../shared/link/link.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Messages} from '../../../messages.enum';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {\n    CrupdateLinkModalComponent,\n    CrupdateLinkModalData,\n} from '../../link/crupdate-link-modal/crupdate-link-modal.component';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {\n    AttachLinkModalComponent,\n    AttachLinkModalData,\n} from '../attach-link-modal/attach-link-modal.component';\nimport {LinkGroup} from '../../../shared/link/link-group';\nimport {SKELETON_ANIMATIONS} from '@common/core/ui/skeleton/skeleton-animations';\nimport {LINK_INDEX_FILTERS} from '../../link/link-index/link-index-filters';\nimport {DatatableFilter} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\n\n@Component({\n    selector: 'link-group-links-index',\n    templateUrl: './link-group-links-index.component.html',\n    styleUrls: ['./link-group-links-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: SKELETON_ANIMATIONS,\n    providers: [DatatableService],\n})\nexport class LinkGroupLinksIndexComponent implements OnInit {\n    filters: DatatableFilter[];\n    loading$ = new BehaviorSubject(false);\n    groupId$ = new BehaviorSubject<number>(null);\n\n    constructor(\n        public route: ActivatedRoute,\n        private modal: Modal,\n        public datatable: DatatableService<Link>,\n        private linkUsage: LinkUsageService,\n        private linkGroups: LinkGroupService,\n        private links: LinkService,\n        private toast: Toast,\n        private router: Router,\n        public currentUser: CurrentUser\n    ) {}\n\n    ngOnInit() {\n        this.route.params.subscribe(params => {\n            this.groupId$.next(params.groupId);\n        });\n        // this.setFilters();\n        // this.datatable.init({\n        //     uri: `${LinkGroupService.BASE_URI}/${this.route.snapshot.params.groupId}/links`,\n        // });\n        //\n        // this.datatable.paginator.response$.subscribe(response => {\n        //     this.linkGroup$.next(response?.linkGroup as LinkGroup);\n        // });\n    }\n\n    filterByUser(): boolean {\n        return this.router.url.indexOf('admin') === -1;\n    }\n\n    private setFilters() {\n        this.filters = LINK_INDEX_FILTERS.filter(\n            f => f.key !== 'user_id' || !this.filterByUser()\n        );\n    }\n}\n","<link-index [groupId]=\"route.snapshot.params.groupId\"></link-index>\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\n\n@Component({\n  selector: 'generic-page-preview',\n  templateUrl: './generic-page-preview.component.html',\n  styleUrls: ['./generic-page-preview.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GenericPagePreviewComponent {}\n","<div class=\"navbar\">\n    <div class=\"os-button\"></div>\n    <div class=\"os-button\"></div>\n    <div class=\"os-button\"></div>\n</div>\n\n<div class=\"page-body\">\n    <div class=\"top-row\">\n        <div class=\"circle\"></div>\n        <div class=\"line\"></div>\n        <div class=\"line\"></div>\n        <div class=\"line\"></div>\n    </div>\n\n    <div class=\"middle-row\">\n        <div class=\"line\"></div>\n        <div class=\"line\"></div>\n        <div class=\"line\"></div>\n        <div class=\"line\"></div>\n    </div>\n\n    <div class=\"flex-container\">\n        <div class=\"left\">\n            <div class=\"rect\"></div>\n            <div class=\"line fat-line\"></div>\n            <div class=\"line\"></div>\n            <div class=\"line\"></div>\n            <div class=\"separator\"></div>\n            <div class=\"rect\"></div>\n            <div class=\"line\"></div>\n        </div>\n\n        <div class=\"right\">\n            <div class=\"rect\"></div>\n            <div class=\"line\"></div>\n            <div class=\"fat-line line\"></div>\n            <div class=\"line\"></div>\n            <div class=\"separator\"></div>\n            <div class=\"line\"></div>\n        </div>\n    </div>\n</div>\n","<div class=\"left\">\n    <mat-progress-bar\n        mode=\"indeterminate\"\n        color=\"accent\"\n        *ngIf=\"loading$ | async\"\n    ></mat-progress-bar>\n    <form (ngSubmit)=\"confirm()\" [formGroup]=\"form\" ngNativeValidate>\n        <mat-tab-group color=\"accent\" animationDuration=\"200ms\">\n            <mat-tab [label]=\"'General' | trans\">\n                <div class=\"many-inputs tab-body-wrapper\">\n                    <div class=\"input-container\">\n                        <label for=\"name\" trans>Name</label>\n                        <input type=\"text\" id=\"name\" formControlName=\"name\" required />\n                        <div class=\"error\" *ngIf=\"errors.name\">{{ errors.name }}</div>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"position\" trans>Position</label>\n                        <select id=\"position\" formControlName=\"position\" required>\n                            <option value=\"top-left\" trans>Top Left</option>\n                            <option value=\"top-right\" trans>Top Right</option>\n                            <option value=\"bottom-left\" trans>Bottom Left</option>\n                            <option value=\"bottom-right\" trans>Bottom Right</option>\n                        </select>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"link-overlay-theme\" trans>Theme</label>\n                        <select id=\"link-overlay-theme\" formControlName=\"theme\" required>\n                            <option value=\"default\" trans>Default</option>\n                            <option value=\"full-width\" trans>Full Width</option>\n                            <option value=\"rounded\" trans>Rounded</option>\n                            <option value=\"pill\" trans>Pill</option>\n                        </select>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"message\" trans>Message</label>\n                        <textarea\n                            id=\"message\"\n                            formControlName=\"message\"\n                            maxlength=\"200\"\n                            required\n                        ></textarea>\n                        <div class=\"error\" *ngIf=\"errors.message\">{{ errors.message }}</div>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"label\" trans>Label</label>\n                        <input type=\"text\" id=\"label\" formControlName=\"label\" maxlength=\"8\" />\n                        <div class=\"error\" *ngIf=\"errors.label\">{{ errors.label }}</div>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"btn_link\" trans>Button Link</label>\n                        <input type=\"url\" id=\"btn_link\" formControlName=\"btn_link\" />\n                        <div class=\"error\" *ngIf=\"errors.btn_link\">{{ errors.btn_link }}</div>\n                    </div>\n                    <div class=\"input-container\">\n                        <label for=\"btn_text\" trans>Button Text</label>\n                        <input\n                            type=\"text\"\n                            id=\"btn_text\"\n                            formControlName=\"btn_text\"\n                            maxlength=\"30\"\n                        />\n                        <div class=\"error\" *ngIf=\"errors.btn_text\">{{ errors.btn_text }}</div>\n                    </div>\n                    <button mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>\n                        {{ overlay ? 'Update' : 'Create' }}\n                    </button>\n                </div>\n            </mat-tab>\n            <mat-tab [label]=\"'Design' | trans\">\n                <div class=\"tab-body-wrapper\" formGroupName=\"colors\">\n                    <upload-image-control\n                        class=\"overlay-bg-input\"\n                        formControlName=\"bg-image\"\n                        diskPrefix=\"link-overlay-images\"\n                    ></upload-image-control>\n                    <color-picker-input\n                        *ngFor=\"let pair of colorControls() | keyvalue\"\n                        [formControlName]=\"pair.key\"\n                        >{{ colorViewName(pair.key) }}</color-picker-input\n                    >\n                    <button mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>\n                        {{ overlay ? 'Update' : 'Create' }}\n                    </button>\n                </div>\n            </mat-tab>\n        </mat-tab-group>\n    </form>\n</div>\n<div class=\"right\">\n    <generic-page-preview></generic-page-preview>\n    <link-overlay [overlay]=\"form.valueChanges | async\"></link-overlay>\n    <div class=\"cdk-overlay-backdrop cdk-overlay-backdrop-showing cdk-overlay-dark-backdrop\"></div>\n</div>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component, OnInit,\n    ViewChild\n} from '@angular/core';\nimport {FormBuilder, FormGroup} from '@angular/forms';\nimport {LinkOverlayComponent} from '../../../../shared/link-overlay/link-overlay.component';\nimport {LinkOverlayService} from '../../link-overlay.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {Translations} from '@common/core/translations/translations.service';\nimport {LinkOverlay} from '../../link-overlay';\nimport {Messages} from '../../../../messages.enum';\nimport {finalize} from 'rxjs/operators';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {BehaviorSubject} from 'rxjs';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport { ComponentCanDeactivate } from '@common/guards/pending-changes/component-can-deactivate';\n\n@Component({\n    selector: 'crupdate-link-overlay-page',\n    templateUrl: './crupdate-link-overlay-page.component.html',\n    styleUrls: ['./crupdate-link-overlay-page.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CrupdateLinkOverlayPageComponent implements AfterViewInit, OnInit, ComponentCanDeactivate {\n    @ViewChild(LinkOverlayComponent, {static: true}) overlayCmp: LinkOverlayComponent;\n    public loading$ = new BehaviorSubject(false);\n    public errors: Partial<LinkOverlay> = {};\n    public overlay: LinkOverlay;\n\n    public form = this.fb.group({\n        name: [''],\n        position: [''],\n        theme: [''],\n        message: [''],\n        label: [''],\n        label_position: [''],\n        btn_link: [''],\n        btn_text: [''],\n        colors: this.fb.group({\n            'bg-image': this.fb.control(null),\n            'bg-color': this.fb.control(''),\n            'text-color': this.fb.control(''),\n            'label-bg-color': this.fb.control(''),\n            'label-color': this.fb.control(''),\n            'btn-bg-color': this.fb.control(''),\n            'btn-text-color': this.fb.control(''),\n        }),\n    });\n\n    constructor(\n        private fb: FormBuilder,\n        private linkOverlays: LinkOverlayService,\n        private toast: Toast,\n        private i18n: Translations,\n        private cd: ChangeDetectorRef,\n        private router: Router,\n        public route: ActivatedRoute,\n    ) {}\n\n    ngOnInit() {\n        this.route.params.subscribe(params => {\n            if (params.id) {\n                this.loading$.next(true);\n                this.linkOverlays.get(params.id)\n                    .pipe(finalize(() => this.loading$.next(false)))\n                    .subscribe(response => {\n                        this.overlay = response.linkOverlay;\n                        this.form.patchValue({...this.overlay});\n                    });\n            }\n        });\n    }\n\n    ngAfterViewInit() {\n        if ( ! this.route.snapshot.params.id) {\n            this.form.patchValue({...this.getDefaultValue()});\n        }\n    }\n\n\n    canDeactivate() {\n        return !this.form.dirty;\n    }\n\n    public confirm() {\n        this.loading$.next(true);\n        const request = this.overlay ?\n            this.linkOverlays.update(this.overlay.id, this.form.value) :\n            this.linkOverlays.create(this.form.value);\n\n        const msg = this.overlay ?\n            Messages.LINK_OVERLAY_UPDATE_SUCCESS :\n            Messages.LINK_OVERLAY_CREATE_SUCCESS;\n\n        request\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(() => {\n                this.toast.open(msg);\n                this.form.markAsPristine();\n                this.router.navigate([this.route.snapshot.params.id ? '../../' : '../'], {relativeTo: this.route});\n            }, (errResponse: BackendErrorResponse) => {\n                this.errors = errResponse.errors;\n                this.cd.markForCheck();\n            });\n    }\n\n    public colorControls() {\n        return (this.form.get('colors') as FormGroup).controls;\n    }\n\n    public colorViewName(name: string) {\n        return name.replace(/-/g, ' ')\n            .replace('bg', 'background')\n            .replace('btn', 'button');\n    }\n\n    private getDefaultValue() {\n        const defaults = {\n            position: 'bottom-left',\n            theme: 'default',\n            message: this.i18n.t('Your message here'),\n            label: this.i18n.t('Label'),\n            btn_text: this.i18n.t('Button Text'),\n            btn_link: 'https://google.com',\n            colors: {},\n        };\n        const style = this.overlayCmp.getComputedStyle();\n        Object.keys(this.colorControls()).forEach(key => {\n            defaults.colors[key] = style.getPropertyValue('--' + key).trim();\n        });\n        return defaults;\n    }\n}\n","import { FindUserModalComponent } from '@common/auth/find-user-modal/find-user-modal.component';\nimport {\n    DatatableFilter,\n    FilterControlType\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {\n    CreatedAtFilter,\n    UpdatedAtFilter\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\n\nexport const LINK_OVERLAY_FILTERS: DatatableFilter[] = [\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'theme',\n        defaultValue: 'default',\n        description: 'Active theme for link overlay',\n        options: [\n            {key: 'default', value: 'default'},\n            {key: 'full-width', value: 'full-width'},\n            {key: 'rounded', value: 'rounded'},\n            {key: 'pill', value: 'pill'},\n        ],\n    }),\n    new CreatedAtFilter({\n        description: 'Date overlay was created',\n    }),\n    new UpdatedAtFilter({\n        description: 'Date overlay was last updated',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'user_id',\n        label: 'User',\n        description: 'User overlay was created by',\n        component: FindUserModalComponent,\n    }),\n];\n","<div class=\"datatable-page-header\">\n  <h1 trans>\n    <span trans>Link Overlays</span>\n    <info-popover>\n      <span trans\n        >Display fully customizable overlay with a message and call-to-action button over\n        destination website.</span\n      >\n    </info-popover>\n  </h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"overlays\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <permission-aware-button permission=\"link_overlays.create\">\n        <button mat-raised-button color=\"accent\" routerLink=\"new\" class=\"button-with-icon\">\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>Add New Overlay</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Name</th>\n        <th *ngIf=\"showUserColumn()\" trans>Owner</th>\n        <th table-sort-header=\"clicks_count\">Message</th>\n        <th trans>Action</th>\n        <th trans>Color</th>\n        <th trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"8\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'overlay(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <permission-aware-button permission=\"link_overlays.delete\">\n              <button\n                type=\"button\"\n                mat-raised-button\n                color=\"warn\"\n                (click)=\"maybeDeleteSelectedOverlays()\"\n                trans\n              >\n                Delete\n              </button>\n            </permission-aware-button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let overlay of overlays$ | async\">\n        <td [table-body-checkbox]=\"overlay.id\"></td>\n        <td data-label=\"Name\">{{ overlay.name }}</td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"overlay.user\"></user-column>\n        </td>\n        <td data-label=\"Message\">{{ overlay.message }}</td>\n        <td data-label=\"Action\">{{ overlay.btn_text }}</td>\n        <td data-label=\"Color\">\n          <mat-icon\n            svgIcon=\"drop-custom\"\n            class=\"color-icon\"\n            [style.color]=\"overlay.colors['bg-color']\"\n          ></mat-icon>\n        </td>\n        <td data-label=\"Last Updated\">{{ overlay.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <permission-aware-button\n            permission=\"link_overlays.update\"\n            [userOwnsResource]=\"currentUser.get('id') === overlay.user_id\"\n          >\n            <button\n              mat-icon-button\n              [routerLink]=\"['edit', overlay.id]\"\n              [matTooltip]=\"'Edit overlay' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <permission-aware-button permission=\"link_overlays.delete\" class=\"visible-on-mobile\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              (click)=\"maybeDeleteSelectedOverlays([overlay.id])\"\n              trans\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </permission-aware-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"popular.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No link overlays have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {LinkOverlay} from '../link-overlay';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {Messages} from '../../../messages.enum';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {LinkOverlayService} from '../link-overlay.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {ActivatedRoute} from '@angular/router';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {Observable, Subscription} from 'rxjs';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {ActiveAppSectionService} from '../../active-app-section.service';\nimport {LINK_OVERLAY_FILTERS} from './link-overlay-filters';\n\n@Component({\n    selector: 'link-overlay-index',\n    templateUrl: './link-overlay-index.component.html',\n    styleUrls: ['./link-overlay-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class LinkOverlayIndexComponent implements OnInit, OnDestroy {\n    filters = LINK_OVERLAY_FILTERS;\n    overlays$ = this.datatable.data$ as Observable<LinkOverlay[]>;\n    private workspaceSub: Subscription;\n\n    constructor(\n        public datatable: DatatableService<LinkOverlay>,\n        public currentUser: CurrentUser,\n        private linkUsage: LinkUsageService,\n        private linkOverlays: LinkOverlayService,\n        private toast: Toast,\n        private route: ActivatedRoute,\n        private workspaces: WorkspacesService,\n        private activeSection: ActiveAppSectionService\n    ) {}\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: LinkOverlayService.BASE_URI,\n            staticParams: {\n                with: ['user'],\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    maybeDeleteSelectedOverlays(overlayIds?: number[]) {\n        this.datatable\n            .confirmResourceDeletion('link overlays')\n            .subscribe(() => {\n                this.linkOverlays\n                    .delete(overlayIds || this.datatable.selectedRows$.value)\n                    .subscribe(\n                        () => {\n                            this.datatable.reset();\n                            this.linkUsage.reload();\n                            this.toast.open(\n                                Messages.LINK_OVERLAY_DELETE_SUCCESS\n                            );\n                        },\n                        (errResponse: BackendErrorResponse) => {\n                            this.toast.open(\n                                errResponse.message || HttpErrors.Default\n                            );\n                        }\n                    );\n            });\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = LINK_OVERLAY_FILTERS.filter(\n            f => f.key !== 'user_id' || this.showUserColumn()\n        );\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {LinkOverlay} from './link-overlay';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class LinkOverlayService {\n    static BASE_URI = 'link-overlay';\n    constructor(private http: AppHttpClient) {}\n\n    public index(params: { userId?: number, query?: string } = {}): PaginatedBackendResponse<LinkOverlay> {\n        return this.http.get(`${LinkOverlayService.BASE_URI}`, params);\n    }\n\n    public get(id: number): BackendResponse<{linkOverlay: LinkOverlay}> {\n        return this.http.get(`${LinkOverlayService.BASE_URI}/${id}`);\n    }\n\n    public create(params: { host: string }): BackendResponse<{ linkOverlay: LinkOverlay }> {\n        return this.http.post(LinkOverlayService.BASE_URI, params);\n    }\n\n    public update(id, params: { host: string }): BackendResponse<{ linkOverlay: LinkOverlay }> {\n        return this.http.put(`${LinkOverlayService.BASE_URI}/${id}`, params);\n    }\n\n    public delete(ids: number[]): BackendResponse<void> {\n        return this.http.delete(`${LinkOverlayService.BASE_URI}/${ids}`);\n    }\n}\n","var e,t,n=\"function\"==typeof Map?new Map:(e=[],t=[],{has:function(t){return e.indexOf(t)>-1},get:function(n){return t[e.indexOf(n)]},set:function(n,o){-1===e.indexOf(n)&&(e.push(n),t.push(o))},delete:function(n){var o=e.indexOf(n);o>-1&&(e.splice(o,1),t.splice(o,1))}}),o=function(e){return new Event(e,{bubbles:!0})};try{new Event(\"test\")}catch(e){o=function(e){var t=document.createEvent(\"Event\");return t.initEvent(e,!0,!1),t}}function r(e){var t=n.get(e);t&&t.destroy()}function i(e){var t=n.get(e);t&&t.update()}var l=null;\"undefined\"==typeof window||\"function\"!=typeof window.getComputedStyle?((l=function(e){return e}).destroy=function(e){return e},l.update=function(e){return e}):((l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return function(e){if(e&&e.nodeName&&\"TEXTAREA\"===e.nodeName&&!n.has(e)){var t,r=null,i=null,l=null,d=function(){e.clientWidth!==i&&c()},a=function(t){window.removeEventListener(\"resize\",d,!1),e.removeEventListener(\"input\",c,!1),e.removeEventListener(\"keyup\",c,!1),e.removeEventListener(\"autosize:destroy\",a,!1),e.removeEventListener(\"autosize:update\",c,!1),Object.keys(t).forEach(function(n){e.style[n]=t[n]}),n.delete(e)}.bind(e,{height:e.style.height,resize:e.style.resize,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener(\"autosize:destroy\",a,!1),\"onpropertychange\"in e&&\"oninput\"in e&&e.addEventListener(\"keyup\",c,!1),window.addEventListener(\"resize\",d,!1),e.addEventListener(\"input\",c,!1),e.addEventListener(\"autosize:update\",c,!1),e.style.overflowX=\"hidden\",e.style.wordWrap=\"break-word\",n.set(e,{destroy:a,update:c}),\"vertical\"===(t=window.getComputedStyle(e,null)).resize?e.style.resize=\"none\":\"both\"===t.resize&&(e.style.resize=\"horizontal\"),r=\"content-box\"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),isNaN(r)&&(r=0),c()}function u(t){var n=e.style.width;e.style.width=\"0px\",e.style.width=n,e.style.overflowY=t}function s(){if(0!==e.scrollHeight){var t=function(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}(e),n=document.documentElement&&document.documentElement.scrollTop;e.style.height=\"\",e.style.height=e.scrollHeight+r+\"px\",i=e.clientWidth,t.forEach(function(e){e.node.scrollTop=e.scrollTop}),n&&(document.documentElement.scrollTop=n)}}function c(){s();var t=Math.round(parseFloat(e.style.height)),n=window.getComputedStyle(e,null),r=\"content-box\"===n.boxSizing?Math.round(parseFloat(n.height)):e.offsetHeight;if(r<t?\"hidden\"===n.overflowY&&(u(\"scroll\"),s(),r=\"content-box\"===n.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight):\"hidden\"!==n.overflowY&&(u(\"hidden\"),s(),r=\"content-box\"===n.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight),l!==r){l=r;var i=o(\"autosize:resized\");try{e.dispatchEvent(i)}catch(e){}}}}(e)}),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],r),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],i),e});var d=l;export default d;\n","<div trans>{{message}}</div>\n<share-link-btns\n  [showCopyBtn]=\"true\"\n  [link]=\"data.link\"\n  *ngIf=\"data.link\"\n></share-link-btns>\n","import {\n    Component,\n    OnInit,\n    ChangeDetectionStrategy,\n    Inject,\n} from '@angular/core';\nimport {MAT_SNACK_BAR_DATA} from '@angular/material/snack-bar';\nimport {Link} from '../../../../shared/link/link';\nimport {Messages} from '../../../../messages.enum';\n\n@Component({\n    selector: 'link-created-message',\n    templateUrl: './link-created-message.component.html',\n    styleUrls: ['./link-created-message.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkCreatedMessageComponent {\n    message = this.data.createMsg || Messages.LINK_CREATE_SUCCESS;\n    constructor(\n        @Inject(MAT_SNACK_BAR_DATA)\n        public data: {link: Link; createMsg?: string}\n    ) {}\n}\n","<div class=\"modal-header\">\n  <h2 mat-dialog-title>\n    <ng-container></ng-container>\n    <span *ngIf=\"updating$ | async; else creating\">Edit Link</span>\n    <ng-template #creating><span trans>New Link</span></ng-template>\n  </h2>\n  <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<form (ngSubmit)=\"data.batch ? shortenBatchUrls() : createOrUpdate()\" ngNativeValidate>\n  <mat-dialog-content>\n    <ng-container *ngIf=\"linkForm.errors$ | async as errors\" [formGroup]=\"linkForm.formGroup\">\n      <div *ngIf=\"data.batch; else single\" class=\"input-container\">\n        <label for=\"link-dialog-multiple-urls\" trans>Multiple URLs (one per line)</label>\n        <textarea\n          class=\"multiple-link-textarea\"\n          name=\"link-dialog-multiple-urls\"\n          id=\"link-dialog-multiple-urls\"\n          autocomplete=\"off\"\n          spellcheck=\"false\"\n          formControlName=\"long_urls\"\n          #textarea\n        ></textarea>\n        <div class=\"error\" *ngIf=\"errors.long_urls\">{{ errors.long_urls }}</div>\n      </div>\n      <ng-template #single>\n        <div class=\"input-container link-input-container\">\n          <label for=\"link-dialog-long-url\" class=\"hidden\" trans>Paste long url</label>\n          <div class=\"input-with-action\">\n            <textarea\n              #textarea\n              class=\"single-link-textarea\"\n              type=\"text\"\n              id=\"link-dialog-long-url\"\n              autocomplete=\"off\"\n              spellcheck=\"false\"\n              enterKeybind\n              (enterPressed)=\"createOrUpdate()\"\n              formControlName=\"long_url\"\n              placeholder=\"Enter long url...\"\n              trans-placeholder\n              [minlength]=\"minLen\"\n              [maxlength]=\"maxLen\"\n              required\n            ></textarea>\n            <ng-container *ngIf=\"settings.get('links.enable_type')\">\n              <button\n                mat-flat-button\n                class=\"type-button\"\n                color=\"gray\"\n                type=\"button\"\n                [matMenuTriggerFor]=\"linkTypeMenu.matMenu\"\n              >\n                <span trans>{{ typeViewName() }}</span>\n                <mat-icon svgIcon=\"arrow-drop-down\"></mat-icon>\n              </button>\n              <link-type-menu\n                [linkOptions]=\"linkOptions$ | async\"\n                #linkTypeMenu\n                formControlName=\"type\"\n              ></link-type-menu>\n            </ng-container>\n          </div>\n          <div class=\"error\" *ngIf=\"errors.long_url\">{{ errors.long_url }}</div>\n        </div>\n      </ng-template>\n      <div class=\"actions\">\n        <button type=\"button\" class=\"advanced-options-btn\" mat-button (click)=\"toggleOptions()\">\n          <mat-icon svgIcon=\"settings\"></mat-icon>\n          <span trans>Advanced Options</span>\n        </button>\n      </div>\n\n      <link-options-form\n        [featuresToHide]=\"data.featuresToHide\"\n        [@bodyExpansion]=\"optionsVisible$ | async\"\n        [linkOptions]=\"linkOptions$ | async\"\n        [batch]=\"data.batch\"\n      ></link-options-form>\n    </ng-container>\n  </mat-dialog-content>\n\n  <mat-dialog-actions>\n    <share-link-btns\n      [showCopyBtn]=\"true\"\n      class=\"colored dialog-actions-left\"\n      [link]=\"data.link\"\n      *ngIf=\"data.link\"\n    ></share-link-btns>\n    <button\n      type=\"submit\"\n      class=\"submit-button\"\n      mat-raised-button\n      color=\"accent\"\n      [disabled]=\"loading$ | async\"\n      trans\n    >\n      Confirm\n    </button>\n  </mat-dialog-actions>\n</form>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    Inject,\n    OnInit,\n    ViewChild,\n} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {BehaviorSubject} from 'rxjs';\nimport {Link} from '../../../shared/link/link';\nimport {LinkForm} from '../../../shared/link/link.form';\nimport {\n    CrupdateLinkPayload,\n    LinkService,\n} from '../../../shared/link/link.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {Messages} from '../../../messages.enum';\nimport {animate, state, style, transition, trigger} from '@angular/animations';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {LinkOptionsList} from '../types';\nimport {Settings} from '@common/core/config/settings.service';\nimport {finalize} from 'rxjs/operators';\nimport * as urlRegex from 'url-regex';\nimport autosize from 'autosize';\nimport {Translations} from '@common/core/translations/translations.service';\nimport {RecaptchaService} from '@common/core/services/recaptcha.service';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {CrupdateLinkSelectValuesService} from '../crupdate-link-select-values.service';\nimport {LinkCreatedMessageComponent} from './link-created-message/link-created-message.component';\nimport {CrupdateLinkFeature} from '../crupdate-link-feature';\n\nexport interface CrupdateLinkModalData {\n    link?: Link;\n    groups?: CrupdateLinkPayload['groups'];\n    batch?: boolean;\n    featuresToHide?: {[key in CrupdateLinkFeature]?: boolean};\n    createMsg?: string;\n}\n\n@Component({\n    selector: 'crupdate-link-modal',\n    templateUrl: './crupdate-link-modal.component.html',\n    styleUrls: ['./crupdate-link-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: [\n        trigger('bodyExpansion', [\n            state('false', style({height: '0px', visibility: 'hidden'})),\n            state('true', style({height: '*', visibility: 'visible'})),\n            transition(\n                'true <=> false',\n                animate('225ms cubic-bezier(0.4,0.0,0.2,1)')\n            ),\n        ]),\n    ],\n    providers: [LinkForm],\n})\nexport class CrupdateLinkModalComponent implements OnInit, AfterViewInit {\n    @ViewChild('textarea') textarea: ElementRef<HTMLTextAreaElement>;\n    loading$ = new BehaviorSubject(false);\n    updating$ = new BehaviorSubject(false);\n    optionsVisible$ = new BehaviorSubject(false);\n    linkOptions$ = new BehaviorSubject<LinkOptionsList>(null);\n\n    minLen: number = this.settings.get('links.min_len');\n    maxLen: number = this.settings.get('links.max_len');\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateLinkModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateLinkModalData,\n        public linkForm: LinkForm,\n        private links: LinkService,\n        private toast: Toast,\n        private selectValues: CrupdateLinkSelectValuesService,\n        private currentUser: CurrentUser,\n        public settings: Settings,\n        private i18n: Translations,\n        private recaptcha: RecaptchaService\n    ) {\n        if (data.link) {\n            this.updating$.next(true);\n            this.linkForm.patchValue(data.link);\n        }\n    }\n\n    ngOnInit() {\n        this.selectValues.get().subscribe(response => {\n            this.linkOptions$.next(response);\n        });\n    }\n\n    ngAfterViewInit() {\n        autosize(this.textarea.nativeElement);\n    }\n\n    async createOrUpdate() {\n        const payload = this.getPayload();\n        if (this.urlInvalid(payload.long_url)) {\n            return this.linkForm.setErrors({\n                long_url: this.i18n.t('This url is invalid.'),\n            });\n        }\n\n        this.loading$.next(true);\n\n        if (!(await this.recaptcha.verify('link_creation'))) {\n            return this.loading$.next(false);\n        }\n\n        const request = this.updating$.value\n            ? this.links.update(this.data.link.id, payload)\n            : this.links.create(payload);\n\n        request.pipe(finalize(() => this.loading$.next(false))).subscribe(\n            response => {\n                this.updating$.value\n                    ? this.toast.open(Messages.LINK_UPDATE_SUCCESS)\n                    : this.toast.openComponent(LinkCreatedMessageComponent, {\n                          data: {\n                              link: response.link,\n                              createMsg: this.data.createMsg,\n                          },\n                          duration: 6000,\n                          panelClass: 'link-created-snackbar',\n                      });\n                this.close(response.link);\n            },\n            (e: BackendErrorResponse) => this.linkForm.setErrors(e.errors)\n        );\n    }\n\n    async shortenBatchUrls() {\n        const payload = this.getPayload();\n        if (payload.long_urls.some(u => this.urlInvalid(u))) {\n            return this.linkForm.setErrors({\n                long_urls: this.i18n.t('Some of the urls are not valid.'),\n            });\n        }\n\n        this.loading$.next(true);\n\n        if (!(await this.recaptcha.verify('link_creation'))) {\n            return this.loading$.next(false);\n        }\n\n        this.links\n            .createBatch(payload)\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(\n                response => {\n                    this.toast.open(Messages.MULTIPLE_LINKS_CREATE_SUCCESS);\n                    this.close(response.links);\n                },\n                (e: BackendErrorResponse) => this.linkForm.setErrors(e.errors)\n            );\n    }\n\n    close(data?: Link | Link[]) {\n        this.dialogRef.close(data);\n    }\n\n    toggleOptions() {\n        this.optionsVisible$.next(!this.optionsVisible$.value);\n    }\n\n    typeViewName() {\n        const type = this.linkForm.formGroup.get('type').value;\n        return type.split(':')[0];\n    }\n\n    private getPayload() {\n        const payload = this.linkForm.value();\n        if (this.data.groups) {\n            payload.groups = {...payload.groups, ...this.data.groups};\n        }\n        return payload;\n    }\n\n    private urlInvalid(url: string): boolean {\n        return !urlRegex({exact: true, strict: false}).test(url);\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpCacheClient} from '@common/core/http/http-cache-client';\nimport {LINK_PAGE_TYPE, LinkOptionsList} from './types';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {ValueLists} from '@common/core/services/value-lists.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class CrupdateLinkSelectValuesService {\n    constructor(\n        private http: HttpCacheClient,\n        private currentUser: CurrentUser,\n    ) {}\n\n    public get(): BackendResponse<LinkOptionsList> {\n        const names = ['countries', 'domains', 'pages', 'overlays', 'pixels', 'groups'];\n        return this.http.getWithCache(`${ValueLists.BASE_URI}/${names.join(',')}`, {\n            userId: this.currentUser.get('id'),\n            pageType: LINK_PAGE_TYPE\n        });\n    }\n\n    public clearCache() {\n        this.http.clearCache();\n    }\n}\n","import {SelectOptionLists} from '@common/core/services/value-lists.service';\nimport {LinkOverlay} from '../link-overlay/link-overlay';\nimport {TrackingPixel} from '../pixels/tracking-pixel';\nimport {LinkGroup} from '../../shared/link/link-group';\n\nexport const LINK_PAGE_TYPE = 'link_page';\n\nexport interface LinkOptionsList extends SelectOptionLists {\n    overlays?: LinkOverlay[];\n    pixels?: TrackingPixel[];\n    groups?: LinkGroup[];\n}\n","import {\n    ALL_PRIMITIVE_OPERATORS,\n    DatatableFilter, FilterControlType,\n    FilterOperator\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {\n    CreatedAtFilter,\n    TimestampFilter,\n    UpdatedAtFilter\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\nimport { FindUserModalComponent } from '@common/auth/find-user-modal/find-user-modal.component';\n\nexport const LINK_INDEX_FILTERS: DatatableFilter[] = [\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'type',\n        description: 'Type of the link',\n        defaultValue: 'direct',\n        options: [\n            {key: 'All', value: ''},\n            {key: 'Direct', value: 'direct'},\n            {key: 'Overlay', value: 'overlay'},\n            {key: 'Frame', value: 'frame'},\n            {key: 'Custom Page', value: 'link_page'},\n        ],\n    }),\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'active',\n        label: 'status',\n        defaultValue: false,\n        description: 'Whether link is disabled or not',\n        options: [\n            {key: 'enabled', value: false},\n            {key: 'disabled', value: true},\n        ],\n    }),\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'password',\n        description: 'Whether link is password protected',\n        options: [\n            {key: 'any', value: ''},\n            {\n                key: 'does not have password',\n                value: {value: null, operator: FilterOperator.eq},\n            },\n            {key: 'has password', value: {value: null, operator: FilterOperator.ne}},\n        ],\n    }),\n    new DatatableFilter({\n        type: FilterControlType.Input,\n        inputType: 'number',\n        key: 'clicks_count',\n        label: 'Click Count',\n        description: 'Total number of clicks for link',\n        defaultValue: 1,\n        defaultOperator: FilterOperator.gte,\n        operators: ALL_PRIMITIVE_OPERATORS,\n    }),\n    new TimestampFilter({\n        key: 'clicked_at',\n        label: 'Clicked At',\n        description: 'Date the link was last clicked',\n    }),\n    new TimestampFilter({\n        key: 'expires_at',\n        label: 'Expires At',\n        description: 'Date the link will expire',\n    }),\n    new CreatedAtFilter({\n        description: 'Date link was created',\n    }),\n    new UpdatedAtFilter({\n        description: 'Date link was last updated',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'user_id',\n        label: 'User',\n        description: 'User link was created by',\n        component: FindUserModalComponent,\n    }),\n];\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Add Existing Links to Group</h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<mat-dialog-content>\n    <div class=\"input-container\">\n        <input type=\"text\" placeholder=\"Search for links...\" [formControl]=\"searchControl\">\n        <mat-progress-bar mode=\"indeterminate\" color=\"accent\" *ngIf=\"loading$ | async\"></mat-progress-bar>\n    </div>\n\n    <div class=\"links\" *ngIf=\"links$ | async as links\">\n        <div class=\"link\" *ngFor=\"let link of links\" (click)=\"confirm(link)\">\n            <img [src]=\"link.long_url | favicon\">\n            <button class=\"meta overflow-hidden no-style\" [disabled]=\"loading$ | async\">\n                <span class=\"long-url overflow-hidden\">{{link.long_url}}</span>\n                <span class=\"short-url overflow-hidden\">{{link.short_url}}</span>\n            </button>\n        </div>\n        <div class=\"link\" *ngIf=\"!links.length\">\n            <no-results-message>\n                <span secondary-text trans>Could not find any links matching this query.</span>\n            </no-results-message>\n        </div>\n    </div>\n</mat-dialog-content>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    OnInit,\n} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {LinkGroup} from '../../../shared/link/link-group';\nimport {LinkGroupService} from '../../../shared/link/link-group.service';\nimport {BehaviorSubject, Observable, of} from 'rxjs';\nimport {LinkService} from '../../../shared/link/link.service';\nimport {FormControl} from '@angular/forms';\nimport {\n    catchError,\n    debounceTime,\n    distinctUntilChanged,\n    finalize,\n    map,\n    startWith,\n    switchMap,\n} from 'rxjs/operators';\nimport {Link} from '../../../shared/link/link';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Messages} from '../../../messages.enum';\nimport {getFaviconFromUrl} from '@common/core/utils/get-favicon-from-url';\nimport {ActiveAppSectionService} from '../../active-app-section.service';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\n\nexport interface AttachLinkModalData {\n    groupId: number;\n}\n\n@Component({\n    selector: 'attach-link-modal',\n    templateUrl: './attach-link-modal.component.html',\n    styleUrls: ['./attach-link-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AttachLinkModalComponent implements OnInit {\n    loading$ = new BehaviorSubject(false);\n    links$ = new BehaviorSubject<Link[]>(null);\n    searchControl = new FormControl();\n\n    constructor(\n        private dialogRef: MatDialogRef<AttachLinkModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: AttachLinkModalData,\n        private linkGroup: LinkGroupService,\n        private link: LinkService,\n        private currentUser: CurrentUser,\n        private toast: Toast,\n        private activeSection: ActiveAppSectionService,\n        private workspaces: WorkspacesService\n    ) {}\n\n    ngOnInit() {\n        this.searchControl.valueChanges\n            .pipe(\n                startWith(''),\n                debounceTime(250),\n                distinctUntilChanged(),\n                switchMap(query => this.findLinks(query)),\n                catchError(() => of([]))\n            )\n            .subscribe(links => {\n                this.links$.next(links);\n                this.loading$.next(false);\n            });\n    }\n\n    public close(link?: Link) {\n        this.dialogRef.close(link);\n    }\n\n    public confirm(link: Link) {\n        this.loading$.next(true);\n        this.linkGroup\n            .attach(this.data.groupId, [link.id])\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(() => {\n                this.toast.open(Messages.LINK_ATTACH_SUCCESS);\n                this.close(link);\n            });\n    }\n\n    private findLinks(query: string): Observable<Link[]> {\n        this.loading$.next(true);\n        const groupId = '!' + this.data.groupId;\n        const userId = this.forCurrentUser()\n            ? this.currentUser.get('id')\n            : null;\n        return this.link\n            .index({query, userId, groupId, per_page: 8})\n            .pipe(map(r => r.pagination.data));\n    }\n\n    private forCurrentUser(): boolean {\n        // show in admin and if active workspace is not personal\n        return !this.activeSection.admin && !this.workspaces.activeId$.value;\n    }\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n    name: 'removeProtocol'\n})\nexport class RemoveProtocolPipe implements PipeTransform {\n    transform(value: string): string {\n        return value && value.replace(/(^\\w+:|^)\\/\\//, '');\n    }\n}\n","<div class=\"datatable-page-header\">\n  <h1>\n    <ng-container *ngIf=\"groupId\">\n      <a routerLink=\"../../\" mat-icon-button class=\"back-button\">\n        <mat-icon svgIcon=\"arrow-back\"></mat-icon>\n      </a>\n      <span *ngIf=\"group$ | async as group\" trans [transValues]=\"{groupName: group.name}\">\n        Links for \":groupName\"\n      </span>\n    </ng-container>\n    <span *ngIf=\"!groupId\" trans>Links</span>\n  </h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"links\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <button mat-raised-button class=\"btn-with-dropdown-icon\" [matMenuTriggerFor]=\"menu\">\n        <span trans>More Actions</span>\n        <mat-icon svgIcon=\"keyboard-arrow-down\"></mat-icon>\n      </button>\n      <mat-menu #menu=\"matMenu\">\n        <permission-aware-button permission=\"link_groups.update\" *ngIf=\"groupId\">\n          <button mat-menu-item (click)=\"showAttachLinksToGroupModal()\">\n            <mat-icon svgIcon=\"shortcut\"></mat-icon>\n            <span trans>Move existing links to this group</span>\n          </button>\n        </permission-aware-button>\n        <permission-aware-button permission=\"links.create\">\n          <button mat-menu-item (click)=\"showCrupdateLinkModal(null, true)\">\n            <mat-icon svgIcon=\"add-link\"></mat-icon>\n            <span trans>{{groupId ? 'Add multiple links' : 'Shorten multiple links'}}</span>\n          </button>\n        </permission-aware-button>\n        <button mat-menu-item (click)=\"exportCsv()\">\n          <mat-icon svgIcon=\"export-csv\"></mat-icon>\n          <span trans>Export links in CSV</span>\n        </button>\n      </mat-menu>\n      <permission-aware-button permission=\"links.create\">\n        <button\n          mat-raised-button\n          color=\"accent\"\n          (click)=\"showCrupdateLinkModal()\"\n          class=\"button-with-icon\"\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>{{groupId ? 'Add Link' : 'Shorten Link'}}</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th trans>Summary</th>\n        <ng-container *ngIf=\"showUserColumn()\">\n          <th table-sort-header=\"user_id\" trans>Owner</th>\n        </ng-container>\n        <th table-sort-header=\"clicks_count\">Clicks</th>\n        <th table-sort-header trans>Type</th>\n        <th table-sort-header trans>Password</th>\n        <th table-sort-header=\"expires_at\" trans>Expires At</th>\n        <th table-sort-header=\"clicked_at\" trans>Last Clicked</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"9\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'link(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <button\n              type=\"button\"\n              mat-raised-button\n              color=\"accent\"\n              *ngIf=\"groupId\"\n              (click)=\"maybeDetachLinksFromGroup()\"\n              trans\n            >\n              Detach from group\n            </button>\n            <permission-aware-button permission=\"links.delete\">\n              <button\n                type=\"button\"\n                mat-raised-button\n                color=\"warn\"\n                (click)=\"maybeDeleteSelectedLinks()\"\n                trans\n              >\n                Delete\n              </button>\n            </permission-aware-button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let link of links$ | async\">\n        <td [table-body-checkbox]=\"link.id\"></td>\n        <td class=\"link-summary-column mobile-no-label\">\n          <a class=\"long-url\" [href]=\"link.long_url\" target=\"_blank\">\n            <img class=\"favicon-img\" [src]=\"link.long_url | favicon\" alt=\"Link favicon\" />\n            <span>{{ link.long_url | removeProtocol | slice: 0:50 }}</span>\n          </a>\n          <div class=\"short-url\">\n            <a [href]=\"link.short_url\" target=\"_blank\">{{ link.short_url }}</a>\n          </div>\n        </td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"link.user\"></user-column>\n        </td>\n        <td data-label=\"Clicks\">{{ link.clicks_count | number }}</td>\n        <td data-label=\"Type\" class=\"capitalize\">{{ link.type }}</td>\n        <td data-label=\"Password\">\n          <mat-icon svgIcon=\"check\" *ngIf=\"link.has_password\"></mat-icon>\n          <span *ngIf=\"!link.has_password\">-</span>\n        </td>\n        <td data-label=\"Expires At\">\n          {{\n            link.deleted_at\n              ? ('Expired' | trans)\n              : link.expires_at\n              ? (link.expires_at | formattedDate)\n              : '-'\n          }}\n        </td>\n        <td data-label=\"Last Clicked\">{{ link.clicked_at ? (link.clicked_at | formattedDate) : '-' }}</td>\n        <td class=\"edit-column\">\n          <a\n            mat-icon-button\n            [routerLink]=\"['/', getParentRoute(), 'links', link.id]\"\n            [matTooltip]=\"'Link Statistics' | trans\"\n          >\n            <mat-icon svgIcon=\"analytics\"></mat-icon>\n          </a>\n          <copy-link-btn [model]=\"link\"></copy-link-btn>\n          <permission-aware-button\n            permission=\"links.update\"\n            [userOwnsResource]=\"link.user_id === this.currentUser.get('id')\"\n          >\n            <button\n              mat-icon-button\n              (click)=\"showCrupdateLinkModal(link)\"\n              [matTooltip]=\"'Edit link' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <permission-aware-button\n            permission=\"links.delete\"\n            [userOwnsResource]=\"link.user_id === this.currentUser.get('id')\"\n          >\n            <button\n              mat-icon-button\n              class=\"visible-on-mobile\"\n              (click)=\"maybeDeleteSelectedLinks([link.id])\"\n              [matTooltip]=\"'Delete link' | trans\"\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </permission-aware-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"share-link.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No links have been added yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Input,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {Link} from '../../../shared/link/link';\nimport {\n    CrupdateLinkModalComponent,\n    CrupdateLinkModalData,\n} from '../crupdate-link-modal/crupdate-link-modal.component';\nimport {LinkService} from '../../../shared/link/link.service';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {Messages} from '../../../messages.enum';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {LINK_INDEX_FILTERS} from './link-index-filters';\nimport {CsvExporterService} from '@common/csv/csv-exporter.service';\nimport {WorkspacesService} from '@common/workspaces/workspaces.service';\nimport {LinkGroupService} from '../../../shared/link/link-group.service';\nimport {BehaviorSubject, Observable, Subscription} from 'rxjs';\nimport {LinkGroup} from '../../../shared/link/link-group';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {\n    AttachLinkModalComponent,\n    AttachLinkModalData,\n} from '../../link-group/attach-link-modal/attach-link-modal.component';\nimport {ActiveAppSectionService} from '../../active-app-section.service';\nimport {DatatableFilter} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\n\n@Component({\n    selector: 'link-index',\n    templateUrl: './link-index.component.html',\n    styleUrls: ['./link-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class LinkIndexComponent implements OnInit, OnDestroy {\n    @Input() groupId: number;\n    filters: DatatableFilter[];\n    group$ = new BehaviorSubject<LinkGroup>(null);\n    links$ = this.datatable.data$ as Observable<Link[]>;\n    private workspaceSub: Subscription;\n\n    constructor(\n        public datatable: DatatableService<Link>,\n        public currentUser: CurrentUser,\n        private links: LinkService,\n        private toast: Toast,\n        private route: ActivatedRoute,\n        private linkUsage: LinkUsageService,\n        private csv: CsvExporterService,\n        private router: Router,\n        private modal: Modal,\n        private groups: LinkGroupService,\n        private workspaces: WorkspacesService,\n        private activeSection: ActiveAppSectionService\n    ) {}\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: this.groupId\n                ? `${LinkGroupService.BASE_URI}/${this.groupId}/links`\n                : LinkService.BASE_URI,\n            staticParams: {\n                with: ['user'],\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n        if (this.groupId) {\n            this.datatable.paginator.response$.subscribe(response => {\n                this.group$.next(response?.linkGroup);\n            });\n        }\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    maybeDeleteSelectedLinks(linkIds?: number[]) {\n        this.datatable.confirmResourceDeletion('links').subscribe(() => {\n            this.links\n                .delete(linkIds || this.datatable.selectedRows$.value)\n                .subscribe(\n                    () => {\n                        this.datatable.reset();\n                        this.linkUsage.reload();\n                        this.toast.open(Messages.LINK_DELETE_SUCCESS);\n                    },\n                    (errResponse: BackendErrorResponse) => {\n                        this.toast.open(\n                            errResponse.message || HttpErrors.Default\n                        );\n                    }\n                );\n        });\n    }\n\n    showAttachLinksToGroupModal() {\n        this.modal\n            .open(AttachLinkModalComponent, {\n                groupId: this.groupId,\n            } as AttachLinkModalData)\n            .beforeClosed()\n            .subscribe(data => {\n                if (data) {\n                    this.datatable.reset();\n                }\n            });\n    }\n\n    maybeDetachLinksFromGroup() {\n        this.modal\n            .open(ConfirmModalComponent, {\n                title: `Detach Links`,\n                body: `Are you sure you want to detach selected links from this group?`,\n                ok: 'Detach',\n            })\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (!confirmed) return;\n                this.groups\n                    .detach(this.groupId, this.datatable.selectedRows$.value)\n                    .subscribe(\n                        () => this.datatable.reset(),\n                        (err: BackendErrorResponse) => {\n                            this.toast.open(err.message || HttpErrors.Default);\n                        }\n                    );\n            });\n    }\n\n    showCrupdateLinkModal(link?: Link, batch?: boolean) {\n        this.datatable\n            .openCrupdateResourceModal(CrupdateLinkModalComponent, {\n                link,\n                groups: {[this.groupId]: {}},\n                batch,\n            } as CrupdateLinkModalData)\n            .subscribe(() => this.linkUsage.reload());\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = LINK_INDEX_FILTERS.filter(\n            f => f.key !== 'user_id' || this.showUserColumn()\n        );\n    }\n\n    exportCsv() {\n        this.csv.export(LinkService.EXPORT_CSV_URI, {\n            type: this.activeSection.admin ? 'all' : null,\n        });\n    }\n\n    getParentRoute(): string {\n        return this.activeSection.admin ? 'admin' : 'dashboard';\n    }\n}\n","<div class=\"input-container\">\n  <label for=\"crupdate_group_domain_id\" [class.hidden]=\"hideLabel\" trans>Domain</label>\n  <select id=\"crupdate_group_domain_id\" [formControl]=\"formControl\">\n    <option [ngValue]=\"null\" trans>All my domains (including default)</option>\n    <ng-container *ngIf=\"defaultHost$ | async as defaultHost\">\n      <option [ngValue]=\"0\">{{ defaultHost }}</option>\n      <ng-container *ngFor=\"let domain of domains\">\n        <option [ngValue]=\"domain.id\" *ngIf=\"defaultHost !== domain.host\">\n          {{ domain.host }}\n        </option>\n      </ng-container>\n    </ng-container>\n  </select>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Input,\n    OnChanges,\n    OnInit\n} from '@angular/core';\nimport {FormControl, FormGroupDirective} from '@angular/forms';\nimport {ValueLists} from '@common/core/services/value-lists.service';\nimport {BehaviorSubject} from 'rxjs';\nimport {CustomDomain} from '@common/custom-domain/custom-domain';\nimport {Settings} from '@common/core/config/settings.service';\n\n@Component({\n    selector: 'domain-form-control',\n    templateUrl: './domain-form-control.component.html',\n    styleUrls: ['./domain-form-control.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DomainFormControlComponent implements OnInit, OnChanges {\n    @Input() controlName: string;\n    @Input() domains: CustomDomain[] = [];\n    @Input() hideLabel = false;\n    defaultHost$ = new BehaviorSubject<string>(null);\n    formControl: FormControl;\n\n    constructor(\n        private groupDirective: FormGroupDirective,\n        private valueLists: ValueLists,\n        private settings: Settings\n    ) {}\n\n    ngOnChanges() {\n        if (this.domains.length) {\n            this.setDefaultHost();\n        }\n    }\n\n    ngOnInit(): void {\n        this.formControl = this.groupDirective.form.controls[\n            this.controlName\n        ] as FormControl;\n    }\n\n    private setDefaultHost() {\n        const defaultHost = this.settings.get('custom_domains.default_host');\n        if (defaultHost) {\n            this.defaultHost$.next(\n                this.domains.find(d => d.host === defaultHost).host\n            );\n        } else {\n            const baseUrl = this.settings\n                .getBaseUrl()\n                .replace(/\\/$/, '')\n                .replace(/(^\\w+:|^)\\/\\//, '');\n            this.defaultHost$.next(baseUrl);\n        }\n    }\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    OnInit,\n} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {FormBuilder} from '@angular/forms';\nimport {removeNullFromObject} from '@common/core/utils/remove-null-from-object';\n\ninterface UtmBuilderDialogComponentData {\n    utmQuery?: string;\n}\n\n@Component({\n    selector: 'utm-builder-dialog',\n    templateUrl: './utm-builder-dialog.component.html',\n    styleUrls: ['./utm-builder-dialog.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UtmBuilderDialogComponent implements OnInit {\n    public form = this.fb.group({\n        utm_source: this.fb.control(null),\n        utm_medium: this.fb.control(null),\n        utm_campaign: this.fb.control(null),\n        utm_term: this.fb.control(null),\n        utm_content: this.fb.control(null),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<UtmBuilderDialogComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: UtmBuilderDialogComponentData,\n        private fb: FormBuilder\n    ) {}\n\n    ngOnInit() {\n        this.hydrateForm();\n    }\n\n    save() {\n        this.dialogRef.close(this.formToUrlParams().toString());\n    }\n\n    close() {\n        this.dialogRef.close();\n    }\n\n    private hydrateForm() {\n        if (this.data.utmQuery) {\n            const params = new URLSearchParams(this.data.utmQuery);\n            const formValue = {};\n            params.forEach((value: string, key: string) => {\n                formValue[key] = value;\n            });\n            this.form.patchValue(formValue);\n        }\n    }\n\n    private formToUrlParams(): URLSearchParams {\n        return new URLSearchParams(\n            removeNullFromObject(this.form.value)\n        );\n    }\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>UTM Builder</h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form (ngSubmit)=\"save()\" ngNativeValidate [formGroup]=\"form\">\n    <mat-dialog-content>\n        <div class=\"inline-inputs-container many-inputs\">\n            <div class=\"input-container\">\n                <label for=\"utm-source\" trans>Source</label>\n                <input\n                    type=\"text\"\n                    id=\"utm-source\"\n                    placeholder=\"e.g: adwords, google, facebook\"\n                    trans-placeholder\n                    formControlName=\"utm_source\"\n                />\n            </div>\n            <div class=\"input-container\">\n                <label for=\"utm-medium\" trans>Medium</label>\n                <input\n                    type=\"text\"\n                    id=\"utm-medium\"\n                    placeholder=\"e.g: banner, email, social post\"\n                    trans-placeholder\n                    formControlName=\"utm_medium\"\n                />\n            </div>\n        </div>\n\n        <div class=\"inline-inputs-container many-inputs\">\n            <div class=\"input-container\">\n                <label for=\"utm-campaign\" trans>Campaign</label>\n                <input\n                    type=\"text\"\n                    id=\"utm-campaign\"\n                    placeholder=\"e.g: holiday special, birthday promo\"\n                    trans-placeholder\n                    formControlName=\"utm_campaign\"\n                />\n            </div>\n            <div class=\"input-container\">\n                <label for=\"utm-term\" trans>Term</label>\n                <input\n                    type=\"text\"\n                    id=\"utm-term\"\n                    placeholder=\"Use to identify ppc keywords\"\n                    trans-placeholder\n                    formControlName=\"utm_term\"\n                />\n            </div>\n        </div>\n\n        <div class=\"inline-inputs-container many-inputs\">\n            <div class=\"input-container\">\n                <label for=\"utm-content\" trans>Content</label>\n                <input\n                    type=\"text\"\n                    id=\"utm-content\"\n                    placeholder=\"Use to differentiate ads or words on a page\"\n                    trans-placeholder\n                    formControlName=\"utm_content\"\n                />\n            </div>\n        </div>\n\n        <div class=\"widget widget-info\">\n            <div trans>\n                UTM codes specified here will be applied to the link automatically when redirecting\n                from short url to destination url.\n            </div>\n        </div>\n    </mat-dialog-content>\n\n    <mat-dialog-actions>\n        <button type=\"submit\" mat-raised-button color=\"accent\" trans>Save</button>\n    </mat-dialog-actions>\n</form>\n","<ng-container [formGroup]=\"linkForm.formGroup\" *ngIf=\"linkForm.errors$ | async as errors\">\n  <div class=\"group first-group\">\n    <div class=\"inline-inputs-container\">\n      <div\n        class=\"input-container\"\n        permission-aware-input-container=\"alias\"\n        *ngIf=\"!batch && !featuresToHide?.alias\"\n      >\n        <label for=\"link-dialog-alias\" trans>Custom Link ID</label>\n        <input\n          type=\"text\"\n          id=\"link-dialog-alias\"\n          formControlName=\"alias\"\n          [minlength]=\"alias.min\"\n          [maxlength]=\"alias.max\"\n          pattern=\"[A-Za-z0-9_-]+\"\n          [placeholder]=\"linkForm.linkHash.value\"\n        />\n        <p class=\"error\" *ngIf=\"errors.alias\">{{ errors.alias }}</p>\n      </div>\n      <div class=\"input-container\">\n        <label for=\"link_dialog_active\" trans>Status</label>\n        <select id=\"link_dialog_active\" formControlName=\"active\">\n          <option [ngValue]=\"true\" trans>Activate</option>\n          <option [ngValue]=\"false\" trans>Disabled</option>\n        </select>\n      </div>\n    </div>\n\n    <div class=\"inline-inputs-container\">\n      <div class=\"input-container\" permission-aware-input-container=\"password\">\n        <label for=\"link-dialog-password\" trans>Password</label>\n        <input\n          type=\"password\"\n          id=\"link-dialog-password\"\n          formControlName=\"password\"\n          autocomplete=\"new-password\"\n        />\n        <p class=\"error\" *ngIf=\"errors.password\">{{ errors.password }}</p>\n      </div>\n    </div>\n\n    <permission-aware-button permission=\"links.create\" restriction=\"utm\">\n      <button type=\"button\" mat-stroked-button color=\"accent\" (click)=\"openUtmBuilder()\" trans>\n        UTM Builder\n      </button>\n    </permission-aware-button>\n  </div>\n\n  <div\n    class=\"group\"\n    *ngIf=\"\n      linkOptions?.domains?.length &&\n      !featuresToHide?.domain &&\n      this.settings.get('custom_domains.allow_select')\n    \"\n  >\n    <header>\n      <div class=\"header-text\">\n        <h3 trans>Domain</h3>\n        <p trans>Select on which domain should this short link be accessible.</p>\n      </div>\n    </header>\n    <domain-form-control\n      [domains]=\"linkOptions.domains\"\n      controlName=\"domain_id\"\n      [hideLabel]=\"true\"\n    ></domain-form-control>\n  </div>\n\n  <div class=\"group\">\n    <header>\n      <div class=\"header-text\">\n        <h3 trans>Schedule</h3>\n        <p [transValues]=\"{resource: resourceName}\" trans>\n          Enter a date when :resource should be active. Both start and end dates are optional.\n        </p>\n      </div>\n    </header>\n    <div class=\"inline-inputs-container\">\n      <div class=\"input-container\" permission-aware-input-container=\"expiration\">\n        <datetime-input id=\"link_dialog_activates_at\" formControlName=\"activates_at\" trans\n          >Start Date</datetime-input\n        >\n        <p class=\"error\" *ngIf=\"errors.activates_at\">{{ errors.activates_at }}</p>\n      </div>\n      <div class=\"input-container\" permission-aware-input-container=\"expiration\">\n        <datetime-input id=\"link_dialog_expires_at\" formControlName=\"expires_at\" trans\n          >End Date</datetime-input\n        >\n        <p class=\"error\" *ngIf=\"errors.expires_at\">{{ errors.expires_at }}</p>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"group\" *ngIf=\"!featuresToHide?.linkGroups && linkOptions?.groups?.length\">\n    <header>\n      <div class=\"header-text\">\n        <h3 trans>Link Groups</h3>\n        <p trans>Groups this link should be attached to.</p>\n      </div>\n    </header>\n    <mat-form-field appearance=\"outline\">\n      <mat-label trans>Select Groups</mat-label>\n      <mat-select formControlName=\"groups\" multiple>\n        <mat-option *ngFor=\"let group of linkOptions.groups\" [value]=\"group.id\">{{\n          capitalize(group.name)\n        }}</mat-option>\n      </mat-select>\n    </mat-form-field>\n  </div>\n\n  <div class=\"group many-inputs\" *ngIf=\"!featuresToHide?.details\">\n    <header>\n      <div class=\"header-text\">\n        <h3 trans>Details</h3>\n        <p trans>Add title, description and upload an image to personalize the link.</p>\n      </div>\n    </header>\n    <div class=\"inline-inputs-container\">\n      <upload-image-control formControlName=\"image\" [compact]=\"true\"></upload-image-control>\n      <div class=\"input-container\">\n        <label for=\"link_dialog_title\" trans>Title</label>\n        <input type=\"text\" id=\"link_dialog_title\" formControlName=\"name\" maxlength=\"140\" />\n        <p class=\"error\" *ngIf=\"errors.name\">{{ errors.name }}</p>\n      </div>\n    </div>\n\n    <div class=\"input-container\" *ngIf=\"!featuresToHide?.tags\">\n      <label for=\"link_dialog_tags\" trans>Tags</label>\n      <chip-input\n        id=\"link_dialog_tags\"\n        formControlName=\"tags\"\n        placeholder=\"+New tag\"\n        trans-placeholder\n      ></chip-input>\n    </div>\n\n    <div class=\"input-container\">\n      <label for=\"link_dialog_description\" trans>Description</label>\n      <textarea\n        id=\"link_dialog_description\"\n        formControlName=\"description\"\n        maxlength=\"240\"\n      ></textarea>\n      <p class=\"error\" *ngIf=\"errors.description\">{{ errors.description }}</p>\n    </div>\n  </div>\n\n  <div class=\"group\" *ngIf=\"linkOptions?.pixels?.length && this.settings.get('links.pixels')\">\n    <header>\n      <div class=\"header-text\">\n        <h3 trans>Tracking Pixel</h3>\n        <p trans>Select tracking pixels that should be used for this link.</p>\n      </div>\n    </header>\n    <mat-form-field appearance=\"outline\">\n      <mat-label trans>Select Pixels</mat-label>\n      <mat-select formControlName=\"pixels\" multiple>\n        <mat-option *ngFor=\"let pixel of linkOptions.pixels\" [value]=\"pixel.id\">{{\n          capitalize(pixel.name)\n        }}</mat-option>\n      </mat-select>\n    </mat-form-field>\n  </div>\n\n  <div\n    class=\"group retargeting-group\"\n    permission-aware-input-container=\"expiration\"\n    [controlGroup]=\"linkForm.expClicksRule\"\n  >\n    <header>\n      <div class=\"header-text\">\n        <h3 trans>Expiration Clicks</h3>\n        <p>\n          <span [transValues]=\"{resource: resourceName}\" trans\n            >After :resource is visited specified amount of times, it will no longer be accessible.</span\n          ><br /><span [transValues]=\"{resource: resourceName}\" trans\n            >Optionally, after click amount is reached :resource can redirect to specified url\n            instead.</span\n          >\n        </p>\n      </div>\n    </header>\n    <div class=\"inline-inputs-container rule-inline-inputs\" formGroupName=\"exp_clicks_rule\">\n      <div class=\"input-container country-input-container\">\n        <label for=\"link_dialog_exp_clicks\" trans>Max Clicks</label>\n        <input type=\"number\" min=\"1\" id=\"link_dialog_exp_clicks\" formControlName=\"key\" />\n      </div>\n\n      <div class=\"input-container\">\n        <label for=\"link_dialog_exp_link\" trans>Redirect Url</label>\n        <input\n          type=\"url\"\n          id=\"link_dialog_exp_link\"\n          formControlName=\"value\"\n          placeholder=\"(Optional)\"\n          trans-placeholder\n        />\n      </div>\n    </div>\n  </div>\n\n  <ng-container *ngIf=\"linkOptions && settings.get('links.retargeting')\">\n    <div\n      class=\"group retargeting-group\"\n      permission-aware-input-container=\"retargeting\"\n      [controlGroup]=\"linkForm.geoRules\"\n    >\n      <header>\n        <div class=\"header-text\">\n          <h3 trans>Location Targeting</h3>\n          <p trans>Redirect users to different url based on their location.</p>\n        </div>\n        <button\n          mat-icon-button\n          color=\"accent\"\n          type=\"button\"\n          (click)=\"linkForm.addNewGeoRule()\"\n          *ngIf=\"!linkForm.geoRules.disabled\"\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n        </button>\n      </header>\n      <ul class=\"unstyled-list\">\n        <li\n          class=\"inline-inputs-container rule-inline-inputs\"\n          *ngFor=\"let group of linkForm.geoRules.controls; let i = index\"\n        >\n          <div class=\"input-container country-input-container\" [formGroup]=\"group\">\n            <label [for]=\"'link_dialog_country-' + i\" trans>Country</label>\n            <select [id]=\"'link_dialog_country-' + i\" formControlName=\"key\">\n              <option [value]=\"country.code\" *ngFor=\"let country of linkOptions.countries\">\n                {{ country.name }}\n              </option>\n            </select>\n          </div>\n\n          <div class=\"input-container\" [formGroup]=\"group\">\n            <label [for]=\"'link_dialog_geo_url-' + i\" trans>Url</label>\n            <input type=\"url\" [id]=\"'link_dialog_geo_url-' + i\" formControlName=\"value\" />\n          </div>\n\n          <button\n            mat-icon-button\n            color=\"warn\"\n            type=\"button\"\n            class=\"remove-rule-btn\"\n            [disabled]=\"group.disabled\"\n            (click)=\"linkForm.geoRules.removeAt(i)\"\n          >\n            <mat-icon svgIcon=\"close\"></mat-icon>\n          </button>\n        </li>\n      </ul>\n    </div>\n\n    <div\n      class=\"group retargeting-group\"\n      permission-aware-input-container=\"retargeting\"\n      [controlGroup]=\"linkForm.deviceRules\"\n    >\n      <header>\n        <div class=\"header-text\">\n          <h3 trans>Device Targeting</h3>\n          <p trans>Redirect users to different url based on their device.</p>\n        </div>\n        <button\n          mat-icon-button\n          color=\"accent\"\n          type=\"button\"\n          (click)=\"linkForm.addNewDeviceRule()\"\n          *ngIf=\"!linkForm.geoRules.disabled\"\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n        </button>\n      </header>\n      <ul class=\"unstyled-list\">\n        <li\n          class=\"inline-inputs-container rule-inline-inputs\"\n          *ngFor=\"let group of linkForm.deviceRules.controls; let i = index\"\n        >\n          <div class=\"input-container device-input-container\" [formGroup]=\"group\">\n            <label [for]=\"'link_dialog_device-' + i\" trans>Device</label>\n            <select [id]=\"'link_dialog_device-' + i\" formControlName=\"key\">\n              <option value=\"desktop\" trans>Desktop</option>\n              <option value=\"tablet\" trans>Tablet</option>\n              <option value=\"mobile\" trans>Mobile</option>\n            </select>\n          </div>\n\n          <div class=\"input-container\" [formGroup]=\"group\">\n            <label [for]=\"'link_dialog_device_url-' + i\" trans>Url</label>\n            <input type=\"url\" [id]=\"'link_dialog_device_url-' + i\" formControlName=\"value\" />\n          </div>\n\n          <button\n            mat-icon-button\n            type=\"button\"\n            color=\"warn\"\n            class=\"remove-rule-btn\"\n            [disabled]=\"group.disabled\"\n            (click)=\"linkForm.deviceRules.removeAt(i)\"\n          >\n            <mat-icon svgIcon=\"close\"></mat-icon>\n          </button>\n        </li>\n      </ul>\n    </div>\n\n    <div\n      class=\"group retargeting-group\"\n      permission-aware-input-container=\"retargeting\"\n      [controlGroup]=\"linkForm.platformRules\"\n    >\n      <header>\n        <div class=\"header-text\">\n          <h3 trans>Platform Targeting</h3>\n          <p trans>Redirect users to different url based on their platform.</p>\n        </div>\n        <button\n          mat-icon-button\n          color=\"accent\"\n          type=\"button\"\n          (click)=\"linkForm.addNewPlatformRule()\"\n          *ngIf=\"!linkForm.geoRules.disabled\"\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n        </button>\n      </header>\n      <ul class=\"unstyled-list\">\n        <li\n          class=\"inline-inputs-container rule-inline-inputs\"\n          *ngFor=\"let group of linkForm.platformRules.controls; let i = index\"\n        >\n          <div class=\"input-container device-input-container\" [formGroup]=\"group\">\n            <label [for]=\"'link_dialog_platform-' + i\" trans>Platform</label>\n            <select [id]=\"'link_dialog_platform-' + i\" formControlName=\"key\">\n              <option value=\"windows\" trans>Windows</option>\n              <option value=\"linux\" trans>Linux</option>\n              <option value=\"osx\" trans>MacOS</option>\n              <option value=\"ios\" trans>iOS</option>\n              <option value=\"androidos\" trans>Android</option>\n            </select>\n          </div>\n\n          <div class=\"input-container\" [formGroup]=\"group\">\n            <label [for]=\"'link_dialog_platform_url-' + i\" trans>Url</label>\n            <input type=\"url\" [id]=\"'link_dialog_platform_url-' + i\" formControlName=\"value\" />\n          </div>\n\n          <button\n            mat-icon-button\n            type=\"button\"\n            color=\"warn\"\n            class=\"remove-rule-btn\"\n            [disabled]=\"group.disabled\"\n            (click)=\"linkForm.platformRules.removeAt(i)\"\n          >\n            <mat-icon svgIcon=\"close\"></mat-icon>\n          </button>\n        </li>\n      </ul>\n    </div>\n  </ng-container>\n</ng-container>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Input,\n    OnChanges,\n    SimpleChanges,\n} from '@angular/core';\nimport {LinkForm} from '../../../shared/link/link.form';\nimport {Settings} from '@common/core/config/settings.service';\nimport {ucFirst} from '@common/core/utils/uc-first';\nimport {BehaviorSubject} from 'rxjs';\nimport {LinkOptionsList} from '../types';\nimport {UtmBuilderDialogComponent} from '../utm-builder-dialog/utm-builder-dialog.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport { CrupdateLinkFeature } from '../crupdate-link-feature';\n\n@Component({\n    selector: 'link-options-form',\n    templateUrl: './link-options-form.component.html',\n    styleUrls: ['./link-options-form.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LinkOptionsFormComponent implements OnChanges {\n    @Input() linkOptions: LinkOptionsList;\n    @Input() batch = false;\n    @Input() featuresToHide: {[key in CrupdateLinkFeature]?: boolean} = {};\n    @Input() resourceName = 'link';\n    defaultHost$ = new BehaviorSubject<string>(null);\n\n    alias = {\n        min: this.settings.get('links.alias_min'),\n        max: this.settings.get('links.alias_max'),\n    };\n\n    constructor(\n        public linkForm: LinkForm,\n        public settings: Settings,\n        private modal: Modal\n    ) {}\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (changes.linkOptions.currentValue) {\n            const defaultHost = this.settings.get(\n                'custom_domains.default_host'\n            );\n            if (defaultHost) {\n                this.defaultHost$.next(\n                    this.linkOptions.domains.find(d => d.host === defaultHost)\n                        .host\n                );\n            } else {\n                const baseUrl = this.settings\n                    .getBaseUrl()\n                    .replace(/\\/$/, '')\n                    .replace(/(^\\w+:|^)\\/\\//, '');\n                this.defaultHost$.next(baseUrl);\n            }\n        }\n    }\n\n    capitalize(str: string): string {\n        return ucFirst(str);\n    }\n\n    openUtmBuilder() {\n        this.modal\n            .open(UtmBuilderDialogComponent, {\n                utmQuery: this.linkForm.formGroup.get('utm').value,\n            })\n            .afterClosed()\n            .subscribe(utmValue => {\n                if (utmValue) {\n                    this.linkForm.formGroup.patchValue({utm: utmValue});\n                }\n            });\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot} from '@angular/router';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {catchError, mergeMap} from 'rxjs/operators';\nimport {EMPTY, of} from 'rxjs';\nimport {GetLinkResponse, LinkService} from '../../../shared/link/link.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class LinkShowResolverService implements Resolve<BackendResponse<GetLinkResponse>> {\n    constructor(\n        private router: Router,\n        private http: AppHttpClient,\n        private link: LinkService,\n    ) {}\n\n    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): BackendResponse<GetLinkResponse> {\n        return this.link.get(route.params.linkId).pipe(\n            catchError(() => {\n                this.router.navigate(['/dashboard/links']);\n                return EMPTY;\n            }),\n            mergeMap(response => {\n                if (response) {\n                    return of(response);\n                } else {\n                    this.router.navigate(['/dashboard/links']);\n                    return EMPTY;\n                }\n            })\n        );\n    }\n}\n\n","<ng-container *ngIf=\"data$ | async as data\">\r\n    <header>\r\n        <img [src]=\"data.link.long_url | favicon\" alt=\"link favicon\">\r\n        <a [href]=\"data.link.long_url\" class=\"long-url\" target=\"_blank\">{{data.link.long_url}}</a>\r\n<!--        <a mat-icon-button routerLink=\"/dashboard/links\" [queryParams]=\"{link_id: data.link.id}\" class=\"edit-btn\">-->\r\n<!--            <mat-icon svgIcon=\"edit\"></mat-icon>-->\r\n<!--        </a>-->\r\n        <copy-link-btn [model]=\"data.link\"></copy-link-btn>\r\n        <share-link-btns [colored]=\"true\" [link]=\"data.link\"></share-link-btns>\r\n    </header>\r\n\r\n    <click-charts [reports]=\"data.analytics\" [endpoint]=\"analyticsEndpoint\"></click-charts>\r\n</ng-container>\r\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {GetLinkResponse, LinkService} from '../../../shared/link/link.service';\nimport {ActivatedRoute} from '@angular/router';\nimport {BehaviorSubject} from 'rxjs';\nimport {Settings} from '@common/core/config/settings.service';\n\n@Component({\n    selector: 'link-show',\n    templateUrl: './link-show.component.html',\n    styleUrls: ['./link-show.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LinkShowComponent implements OnInit {\n    public data$ = new BehaviorSubject<GetLinkResponse>(null);\n    public analyticsEndpoint: string;\n\n    constructor(\n        private route: ActivatedRoute,\n        public settings: Settings,\n    ) {}\n\n    ngOnInit() {\n        this.route.data.subscribe((data: {api: GetLinkResponse}) => {\n            this.data$.next(data.api);\n            this.analyticsEndpoint = `${LinkService.BASE_URI}/${data.api.link.id}`;\n        });\n    }\n}\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ContentChild,\n    ElementRef,\n    Input,\n    OnDestroy,\n    ViewChild,\n    ViewContainerRef,\n} from '@angular/core';\nimport {FormControlName, FormGroup} from '@angular/forms';\nimport {BOTTOM_POSITION} from '@common/core/ui/overlay-panel/positions/bottom-position';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {\n    UpgradeOverlayComponent,\n    UpgradeOverlayData,\n} from '../permissions/upgrade-overlay/upgrade-overlay.component';\nimport {Settings} from '@common/core/config/settings.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {LinkUsageService} from '../../shared/link/link-usage.service';\nimport {LinkFeaturePermissions} from '../../shared/link/link-usage-response';\nimport {BehaviorSubject, Subscription} from 'rxjs';\n\n@Component({\n    selector: '[permission-aware-input-container]',\n    templateUrl: './permission-aware-input-container.component.html',\n    styleUrls: ['./permission-aware-input-container.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PermissionAwareInputContainerComponent\n    implements AfterViewInit, OnDestroy\n{\n    @Input('permission-aware-input-container')\n    permission: keyof LinkFeaturePermissions;\n    @Input() controlGroup: FormGroup;\n\n    @ContentChild(FormControlName) controlName: FormControlName;\n    @ViewChild('lockIcon', {read: ElementRef})\n    lockIcon: ElementRef<HTMLElement>;\n    private listeningToHover: boolean;\n    private overlayRef: OverlayPanelRef<UpgradeOverlayComponent>;\n    lockIconHidden$ = new BehaviorSubject<boolean>(true);\n    private usageSub: Subscription;\n\n    constructor(\n        private cd: ChangeDetectorRef,\n        private overlay: OverlayPanel,\n        private viewContainerRef: ViewContainerRef,\n        private settings: Settings,\n        private currentUser: CurrentUser,\n        private usage: LinkUsageService\n    ) {}\n\n    ngAfterViewInit() {\n        setTimeout(() => {\n            this.usageSub = this.usage.response$.subscribe(response => {\n                if (\n                    !response.usage.links[this.permission] &&\n                    !this.currentUser.isAdmin()\n                ) {\n                    this.lockIconHidden$.next(false);\n\n                    // disable multiple form controls\n                    if (this.controlGroup) {\n                        this.controlGroup.disable();\n                    }\n\n                    // disable single form control\n                    else if (this.controlName) {\n                        this.controlName.control.disable();\n                    }\n\n                    if (this.lockIcon) {\n                        this.createHoverListener();\n                    }\n                }\n            });\n        });\n    }\n\n    ngOnDestroy() {\n        this.usageSub?.unsubscribe();\n    }\n\n    private createHoverListener() {\n        if (!this.listeningToHover) {\n            this.lockIcon.nativeElement.addEventListener('mouseenter', () => {\n                this.cd.markForCheck();\n                this.showMessage();\n            });\n            this.lockIcon.nativeElement.addEventListener('mouseleave', e => {\n                const toElement = e.relatedTarget as HTMLElement;\n                if (toElement?.nodeName?.toLowerCase() !== 'upgrade-overlay') {\n                    this.hideMessage();\n                }\n            });\n            this.listeningToHover = true;\n        }\n    }\n\n    showMessage() {\n        if (this.overlayRef) {\n            this.hideMessage();\n        }\n        this.overlayRef = this.overlay.open(UpgradeOverlayComponent, {\n            origin: this.lockIcon,\n            position: BOTTOM_POSITION,\n            hasBackdrop: false,\n            scrollStrategy: 'close',\n            viewContainerRef: this.viewContainerRef,\n            data: {\n                config: {resource: 'links', createMsgType: this.permission},\n            } as UpgradeOverlayData,\n        });\n        this.overlayRef.getPanelEl().addEventListener('mouseleave', () => {\n            this.hideMessage();\n        });\n    }\n\n    public hideMessage() {\n        if (this.overlayRef) {\n            this.overlayRef.close();\n            this.overlayRef = null;\n        }\n    }\n}\n","<ng-content></ng-content>\n\n<mat-icon svgIcon=\"lock\" class=\"lock-icon\" [class.hidden]=\"lockIconHidden$ | async\" #lockIcon></mat-icon>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    OnInit,\n} from '@angular/core';\nimport {OVERLAY_PANEL_DATA} from '@common/core/ui/overlay-panel/overlay-panel-data';\nimport {PermissionBtnConfig} from '../permission-aware-button/permission-aware-button.component';\nimport { simplePermissionOverlayMsg } from './simple-permission-overlay-message';\n\n@Component({\n    selector: 'simple-permission-overlay',\n    templateUrl: './simple-permission-overlay.component.html',\n    styleUrls: ['./simple-permission-overlay.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {class: 'permission-overlay'},\n})\nexport class SimplePermissionOverlayComponent implements OnInit {\n    public message: string;\n    constructor(\n        @Inject(OVERLAY_PANEL_DATA) public data: {config: PermissionBtnConfig}\n    ) {}\n\n    ngOnInit(): void {\n        this.message = simplePermissionOverlayMsg(\n            this.data.config.resource,\n            this.data.config.forWorkspace,\n            this.data.config.action,\n            this.data.config.createMsgType\n        );\n    }\n}\n","import {CreateMsgType} from '../../../shared/link/link-usage-response';\n\nexport function simplePermissionOverlayMsg(\n    resource: string,\n    forWorkspace: boolean = false,\n    action: 'create' | 'edit' | 'delete',\n    failReason: CreateMsgType\n): string {\n    if (failReason === 'overQuota') {\n        return `You have created the maximum allowed number of ${resource}.`;\n    } else {\n        return noPermissionMessage(resource, forWorkspace, action);\n    }\n}\n\nfunction noPermissionMessage(\n    resource: string,\n    forWorkspace: boolean,\n    action: 'create' | 'edit' | 'delete'\n): string {\n    resource = resource.replace('_', ' ');\n    if (forWorkspace) {\n        return `You are not allowed to ${action} ${resource} in this workspace.`;\n    } else {\n        return `You are not allowed to ${action} ${resource}.`;\n    }\n}\n","<div class=\"overlay\">\n    <mat-icon svgIcon=\"lock\" class=\"lock-icon\"></mat-icon>\n    <span trans>{{message}}</span>\n</div>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ContentChild,\n    ElementRef,\n    Input,\n    OnDestroy,\n    ViewContainerRef,\n} from '@angular/core';\nimport {MatButton} from '@angular/material/button';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {UpgradeOverlayComponent} from '../upgrade-overlay/upgrade-overlay.component';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {BOTTOM_POSITION} from '@common/core/ui/overlay-panel/positions/bottom-position';\nimport {SimplePermissionOverlayComponent} from '../simple-permission-overlay/simple-permission-overlay.component';\nimport {ComponentType} from '@angular/cdk/portal';\nimport {\n    CreateMsgType,\n    LinkFeaturePermissions,\n    LinkUsageResponse,\n} from '../../../shared/link/link-usage-response';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {MatMenuItem} from '@angular/material/menu';\nimport {Subscription} from 'rxjs';\n\nexport interface PermissionBtnConfig {\n    hasPermission: boolean;\n    action: Action;\n    resource: string;\n    createMsgType?: CreateMsgType;\n    userOwnsWorkspace: boolean;\n    forWorkspace: boolean;\n}\n\ntype Action = 'create' | 'edit' | 'delete';\n\n@Component({\n    selector: '[permission-aware-button], permission-aware-button',\n    templateUrl: './permission-aware-button.component.html',\n    styleUrls: ['./permission-aware-button.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PermissionAwareButtonComponent\n    implements AfterViewInit, OnDestroy\n{\n    @Input() permission: string;\n    @Input() restriction: keyof LinkFeaturePermissions;\n    @Input() userOwnsResource: boolean;\n    @ContentChild(MatButton) matButton: MatButton;\n    @ContentChild(MatMenuItem) matMenuItem: MatMenuItem;\n\n    config: PermissionBtnConfig;\n    private overlayRef: OverlayPanelRef;\n    private overlayCmp: ComponentType<any>;\n    private regularButton: HTMLButtonElement;\n    private usageSub: Subscription;\n\n    constructor(\n        private cd: ChangeDetectorRef,\n        private overlay: OverlayPanel,\n        private viewContainerRef: ViewContainerRef,\n        private settings: Settings,\n        private currentUser: CurrentUser,\n        private el: ElementRef<HTMLElement>,\n        private linkUsage: LinkUsageService\n    ) {}\n\n    ngAfterViewInit() {\n        setTimeout(() => {\n            if (!this.matButton && !this.matMenuItem) {\n                this.regularButton = this.el.nativeElement.querySelector('button');\n            }\n            this.usageSub = this.linkUsage.response$.subscribe(response => {\n                this.hydrateConfig(response);\n                if (this.config.hasPermission || this.userOwnsResource) {\n                    this.toggleButtonState(false);\n                    this.overlayCmp = null;\n                } else {\n                    this.toggleButtonState(true);\n                    this.setOverlayCmp();\n                }\n                this.cd.markForCheck();\n            });\n            this.createHoverListener();\n        });\n    }\n\n    ngOnDestroy() {\n        this.usageSub?.unsubscribe();\n    }\n\n    private hydrateConfig(response: LinkUsageResponse) {\n        const [resource, action] = this.permission.split('.');\n        this.config = {\n            resource,\n            action: action as Action,\n            hasPermission:\n                response.usage[resource][this.restriction || action] ||\n                this.currentUser.isAdmin(),\n            forWorkspace: response.forWorkspace,\n            createMsgType: response.usage[resource].createMsgType || this.restriction,\n            userOwnsWorkspace: response.userOwnsWorkspace,\n        };\n    }\n\n    private setOverlayCmp() {\n        if (this.shouldShowUpgradeOverlay()) {\n            this.overlayCmp = UpgradeOverlayComponent;\n        } else {\n            this.overlayCmp = SimplePermissionOverlayComponent;\n        }\n    }\n\n    private shouldShowUpgradeOverlay(): boolean {\n        return (\n            this.settings.get('billing.enable') &&\n            this.config.action === 'create' &&\n            !this.config.hasPermission &&\n            this.config.createMsgType !== 'noWorkspacePermission'\n        );\n    }\n\n    private createHoverListener() {\n        this.el.nativeElement.addEventListener('mouseenter', () => {\n            if (this.overlayCmp) {\n                this.cd.markForCheck();\n                this.showMessage();\n            }\n        });\n        this.el.nativeElement.addEventListener('mouseleave', e => {\n            const toElement = e.relatedTarget as HTMLElement;\n            if (\n                this.overlayRef &&\n                !toElement.classList.contains('permission-overlay')\n            ) {\n                this.hideMessage();\n            }\n        });\n    }\n\n    private toggleButtonState(disabled: boolean) {\n        const btn = this.matButton || this.matMenuItem || this.regularButton;\n        btn.disabled = disabled;\n    }\n\n    showMessage() {\n        if (this.overlayRef) {\n            this.hideMessage();\n        }\n        this.overlayRef = this.overlay.open(this.overlayCmp, {\n            origin: this.matButton._elementRef,\n            position: BOTTOM_POSITION,\n            hasBackdrop: false,\n            scrollStrategy: 'close',\n            viewContainerRef: this.viewContainerRef,\n            data: {config: this.config},\n        });\n        this.overlayRef.getPanelEl().addEventListener('mouseleave', () => {\n            this.hideMessage();\n        });\n    }\n\n    hideMessage() {\n        if (this.overlayRef) {\n            this.overlayRef.close();\n            this.overlayRef = null;\n        }\n    }\n}\n","<ng-content></ng-content>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    OnInit,\n} from '@angular/core';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {OVERLAY_PANEL_DATA} from '@common/core/ui/overlay-panel/overlay-panel-data';\nimport {upgradeOverlayMsgForBtn} from './upgrade-overlay-message';\nimport {Settings} from '@common/core/config/settings.service';\nimport {PermissionBtnConfig} from '../permission-aware-button/permission-aware-button.component';\n\nexport interface UpgradeOverlayData {\n    config: Pick<PermissionBtnConfig, 'resource'|'createMsgType'>;\n}\n\n@Component({\n    selector: 'upgrade-overlay',\n    templateUrl: './upgrade-overlay.component.html',\n    styleUrls: ['./upgrade-overlay.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {class: 'permission-overlay'},\n})\nexport class UpgradeOverlayComponent implements OnInit {\n    message: string;\n    siteName: any;\n    constructor(\n        private overlayPanelRef: OverlayPanelRef,\n        @Inject(OVERLAY_PANEL_DATA) public data: UpgradeOverlayData,\n        private settings: Settings\n    ) {}\n\n    ngOnInit(): void {\n        this.message = upgradeOverlayMsgForBtn(\n            this.data.config.resource,\n            this.data.config.createMsgType\n        );\n        this.siteName = this.settings.get('branding.site_name');\n    }\n}\n","import {CreateMsgType} from '../../../shared/link/link-usage-response';\n\nexport function upgradeOverlayMsgForBtn(\n    resource: string,\n    createMsgType: CreateMsgType\n): string {\n    resource = resource.replace('_', ' ');\n    if (createMsgType === 'overQuota') {\n        return `You've reached the maximum number of ${resource} allowed for your current plan.`;\n    } else if (createMsgType === 'alias') {\n        return 'Your current plan doesn\\'t allow setting custom link ID.';\n    } else if (createMsgType === 'expiration') {\n        return 'Your current plan doesn\\'t allow setting link expiration.';\n    } else if (createMsgType === 'password') {\n        return 'Your current plan doesn\\'t allow setting a password for links.';\n    } else if (createMsgType === 'utm') {\n        return 'Your current plan doesn\\'t include utm builder functionality.';\n    } else if (createMsgType === 'retargeting') {\n        return 'Your current plan doesn\\'t include retargeting functionality.';\n    } else {\n        return `Your current plan doesn't allow creating ${resource}.`;\n    }\n}\n","<div class=\"overlay\">\n    <div class=\"content\">\n        <div trans>\n            <span trans>{{ message }}</span>\n            &ngsp;\n            <span trans [transValues]=\"{siteName: siteName}\">\n                Upgrade to get more out of :siteName.\n            </span>\n        </div>\n        <a\n            class=\"upgrade-button\"\n            mat-raised-button\n            color=\"accent\"\n            routerLink=\"/billing/pricing\"\n            trans\n            >Upgrade Now</a\n        >\n    </div>\n    <svg-image name=\"upgrade\"></svg-image>\n</div>\n","import {Injectable} from '@angular/core';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {TrackingPixel} from './tracking-pixel';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class TrackingPixelService {\n    static BASE_URI = 'pixel';\n\n    constructor(private http: AppHttpClient) {}\n\n    public index(params: { userId?: number, query?: string } = {}): PaginatedBackendResponse<TrackingPixel> {\n        return this.http.get(`${TrackingPixelService.BASE_URI}`, params);\n    }\n\n    public create(params: Partial<TrackingPixel>): BackendResponse<{ pixel: TrackingPixel }> {\n        return this.http.post(TrackingPixelService.BASE_URI, params);\n    }\n\n    public update(id, params: Partial<TrackingPixel>): BackendResponse<{ pixel: TrackingPixel }> {\n        return this.http.put(`${TrackingPixelService.BASE_URI}/${id}`, params);\n    }\n\n    public delete(ids: number[]): BackendResponse<void> {\n        return this.http.delete(`${TrackingPixelService.BASE_URI}/${ids}`);\n    }\n}\n","export interface TrackingPixelType {\n    name: string;\n    type: 'number'|'text';\n    pattern?: string;\n}\n\nexport const TrackingPixelTypes: TrackingPixelType[] = [\n    {\n        name: 'facebook',\n        type: 'number',\n    },\n    {\n        name: 'twitter',\n        type: 'number',\n    },\n    {\n        name: 'google-tag-manager',\n        type: 'text',\n        pattern: 'GTM-[a-zA-Z0-9]+'\n    },\n    {\n        name: 'google-analytics',\n        type: 'text',\n    },\n    {\n        name: 'adwords',\n        type: 'number',\n    },\n    {\n        name: 'bing',\n        type: 'number',\n    },\n    {\n        name: 'pinterest',\n        type: 'number',\n    },\n    {\n        name: 'linkedin',\n        type: 'text',\n    },\n    {\n        name: 'quora',\n        type: 'text',\n        pattern: '[a-z0-9]+',\n    },\n    {\n        name: 'adroll',\n        type: 'text',\n    },\n    {\n        name: 'nexus-segment',\n        type: 'text',\n    },\n    {\n        name: 'custom',\n        type: 'text',\n    },\n];\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title>\n        <span *ngIf=\"data.pixel; else creating\" trans>Update Pixel</span>\n        <ng-template #creating><span trans>Create New Pixel</span></ng-template>\n    </h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form (ngSubmit)=\"confirm()\" [formGroup]=\"form\" ngNativeValidate>\n    <mat-dialog-content class=\"many-inputs\" *ngIf=\"errors$ | async as errors\">\n        <div class=\"input-container\">\n            <label for=\"name\" trans>Name</label>\n            <input type=\"text\" id=\"name\" formControlName=\"name\" required>\n            <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n        </div>\n        <div class=\"input-container\">\n            <label for=\"type\" trans>Type</label>\n            <select id=\"type\" formControlName=\"type\" class=\"type-select\" required>\n                <option [value]=\"type.name\" *ngFor=\"let type of types\">{{viewTypeName(type.name)}}</option>\n            </select>\n        </div>\n        <ng-container *ngIf=\"selectedType$ | async as selectedType\">\n            <div class=\"input-container\" *ngIf=\"selectedType.name !== 'custom'\">\n                <label for=\"pixel_id\" trans>Pixel ID</label>\n                <input id=\"pixel_id\" [type]=\"selectedType.type\" formControlName=\"pixel_id\" [pattern]=\"selectedType.pattern\" required>\n                <div class=\"error\" *ngIf=\"errors.pixel_id\">{{errors.pixel_id}}</div>\n            </div>\n            \n            <div class=\"many-inputs\" *ngIf=\"selectedType.name === 'custom'\">\n                <div class=\"input-container\">\n                    <label for=\"head-code\" trans>Custom Code for Page Head</label>\n                    <textarea name=\"head-code\" id=\"head-code\" rows=\"10\" formControlName=\"head_code\"></textarea>\n                </div>\n                <div class=\"input-container\">\n                    <label for=\"body-code\" trans>Custom Code for Page Body</label>\n                    <textarea name=\"body-code\" id=\"body-code\" rows=\"10\" formControlName=\"body_code\"></textarea>\n                </div>\n            </div>\n        </ng-container>\n    </mat-dialog-content>\n\n    <mat-dialog-actions>\n        <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n        <button type=\"submit\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>\n            <span *ngIf=\"data.pixel\">Update</span>\n            <span *ngIf=\"!data.pixel\">Create</span>\n        </button>\n    </mat-dialog-actions>\n</form>","import {ChangeDetectionStrategy, Component, Inject, OnInit} from '@angular/core';\nimport {FormBuilder} from '@angular/forms';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {TrackingPixel} from '../tracking-pixel';\nimport {TrackingPixelService} from '../tracking-pixel.service';\nimport {Messages} from '../../../messages.enum';\nimport {finalize} from 'rxjs/operators';\nimport {BehaviorSubject} from 'rxjs';\nimport {TrackingPixelType, TrackingPixelTypes} from '../tracking-pixel-types';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\n\ninterface CrupdateTrackingPixelModalData {\n    pixel?: TrackingPixel;\n}\n\n@Component({\n    selector: 'crupdate-tracking-pixel-modal',\n    templateUrl: './crupdate-tracking-pixel-modal.component.html',\n    styleUrls: ['./crupdate-tracking-pixel-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CrupdateTrackingPixelModalComponent implements OnInit {\n    public types = TrackingPixelTypes;\n    public loading$ = new BehaviorSubject(false);\n    public errors$ = new BehaviorSubject<Partial<TrackingPixel>>({});\n    public selectedType$ = new BehaviorSubject<TrackingPixelType>(this.types[0]);\n    public form = this.fb.group({\n        name: [''],\n        type: [this.types[0].name],\n        head_code: [''],\n        body_code: [''],\n        pixel_id: [''],\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateTrackingPixelModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateTrackingPixelModalData,\n        private fb: FormBuilder,\n        private pixels: TrackingPixelService,\n        private toast: Toast,\n    ) {}\n\n    ngOnInit() {\n        this.form.get('type').valueChanges.subscribe(typeName => {\n            this.selectedType$.next(this.types.find(t => t.name === typeName));\n        });\n        if (this.data.pixel) {\n            this.form.patchValue(this.data.pixel);\n        }\n    }\n\n    public confirm() {\n        this.loading$.next(true);\n        const request = this.data.pixel ?\n            this.pixels.update(this.data.pixel.id, this.getPayload()) :\n            this.pixels.create(this.getPayload());\n\n        const msg = this.data.pixel ?\n            Messages.TRACKING_PIXEL_UPDATE_SUCCESS :\n            Messages.TRACKING_PIXEL_CREATE_SUCCESS;\n\n        request\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(response => {\n                this.toast.open(msg);\n                this.close(response.pixel);\n            }, (errResponse: BackendErrorResponse) => this.errors$.next(errResponse.errors));\n    }\n\n    public close(pixel?: TrackingPixel) {\n        this.dialogRef.close(pixel);\n    }\n\n    private getPayload(): Partial<TrackingPixel> {\n        return {...this.form.value};\n    }\n\n    public viewTypeName(type: string) {\n        return type.replace(/-/g, ' ');\n    }\n}\n","import {\n    DatatableFilter,\n    FilterControlType\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport { TrackingPixelTypes } from '../tracking-pixel-types';\nimport {\n    CreatedAtFilter,\n    UpdatedAtFilter\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\nimport { FindUserModalComponent } from '@common/auth/find-user-modal/find-user-modal.component';\n\n\nexport const TRACKING_PIXEL_FILTERS: DatatableFilter[] = [\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'type',\n        defaultValue: 'facebook',\n        description: 'Tracking pixel type',\n        options: TrackingPixelTypes.map(pixel => {\n            return {key: pixel.name, value: pixel.name};\n        }),\n    }),\n    new CreatedAtFilter({\n        description: 'Date pixel was created',\n    }),\n    new UpdatedAtFilter({\n        description: 'Date pixel was last updated',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'user_id',\n        label: 'User',\n        description: 'User overlay was created by',\n        component: FindUserModalComponent,\n    }),\n];\n","<div class=\"datatable-page-header\">\n  <h1 trans>Tracking Pixels</h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"pixels\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <permission-aware-button permission=\"tracking_pixels.create\">\n        <button\n          mat-raised-button\n          color=\"accent\"\n          (click)=\"showCrupdatePixelModal()\"\n          class=\"button-with-icon\"\n        >\n          <mat-icon svgIcon=\"add\"></mat-icon>\n          <span trans>Add New Pixel</span>\n        </button>\n      </permission-aware-button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Name</th>\n        <th *ngIf=\"showUserColumn()\" table-sort-header trans>Owner</th>\n        <th table-sort-header trans>Type</th>\n        <th trans>Pixel ID</th>\n        <th trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"7\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'pixel(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <permission-aware-button permission=\"tracking_pixels.delete\">\n              <button\n                type=\"button\"\n                mat-raised-button\n                color=\"warn\"\n                (click)=\"maybeDeleteSelectedPixels()\"\n                trans\n              >\n                Delete\n              </button>\n            </permission-aware-button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let pixel of pixels$ | async\">\n        <td [table-body-checkbox]=\"pixel.id\"></td>\n        <td data-label=\"Name\">{{ pixel.name }}</td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"pixel.user\"></user-column>\n        </td>\n        <td data-label=\"Type\">{{ pixel.type }}</td>\n        <td data-label=\"Pixel ID\">{{ pixel.pixel_id }}</td>\n        <td data-label=\"Last Updated\">{{ pixel.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <permission-aware-button\n            permission=\"tracking_pixels.update\"\n            [userOwnsResource]=\"currentUser.get('id') === pixel.user_id\"\n          >\n            <button\n              mat-icon-button\n              (click)=\"showCrupdatePixelModal(pixel)\"\n              [matTooltip]=\"'Edit tracking pixel' | trans\"\n            >\n              <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n          </permission-aware-button>\n          <permission-aware-button permission=\"tracking_pixels.delete\" class=\"visible-on-mobile\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              (click)=\"maybeDeleteSelectedPixels([pixel.id])\"\n              trans\n            >\n              <mat-icon svgIcon=\"delete\"></mat-icon>\n            </button>\n          </permission-aware-button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message\n    svgImage=\"location-tracking.svg\"\n    *ngIf=\"datatable.paginator.noResults$ | async\"\n  >\n    <span primary-text trans>No tracking pixels have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    OnDestroy,\n    OnInit\n} from '@angular/core';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {LinkUsageService} from '../../../shared/link/link-usage.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ActivatedRoute} from '@angular/router';\nimport {Messages} from '../../../messages.enum';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {TrackingPixelService} from '../tracking-pixel.service';\nimport {TrackingPixel} from '../tracking-pixel';\nimport {CrupdateTrackingPixelModalComponent} from '../crupdate-tracking-pixel-modal/crupdate-tracking-pixel-modal.component';\nimport { Observable, Subscription } from 'rxjs';\nimport { TRACKING_PIXEL_FILTERS } from './tracking-pixel-filters';\nimport { WorkspacesService } from '@common/workspaces/workspaces.service';\nimport { ActiveAppSectionService } from '../../active-app-section.service';\nimport { CUSTOM_PAGE_FILTERS } from '@common/pages/custom-pages-index/cusomt-page-filters';\n\n@Component({\n    selector: 'tracking-pixel-index',\n    templateUrl: './tracking-pixel-index.component.html',\n    styleUrls: ['./tracking-pixel-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class TrackingPixelIndexComponent implements OnInit, OnDestroy {\n    filters = TRACKING_PIXEL_FILTERS;\n    pixels$ = this.datatable.data$ as Observable<TrackingPixel[]>;\n    private workspaceSub: Subscription;\n\n    constructor(\n        public datatable: DatatableService<TrackingPixel>,\n        public currentUser: CurrentUser,\n        private linkUsage: LinkUsageService,\n        private trackingPixels: TrackingPixelService,\n        private toast: Toast,\n        private route: ActivatedRoute,\n        private workspaces: WorkspacesService,\n        private activeSection: ActiveAppSectionService\n    ) {}\n\n    ngOnInit() {\n        this.workspaceSub = this.workspaces.activeId$.subscribe(() => {\n            this.setFilters();\n        });\n        this.datatable.init({\n            uri: TrackingPixelService.BASE_URI,\n            staticParams: {\n                with: ['user'],\n                userId: !this.showUserColumn()\n                    ? this.currentUser.get('id')\n                    : null,\n            },\n        });\n    }\n\n    ngOnDestroy() {\n        this.workspaceSub.unsubscribe();\n    }\n\n    maybeDeleteSelectedPixels(pixelIds?: number[]) {\n        this.datatable\n            .confirmResourceDeletion('tracking pixels')\n            .subscribe(() => {\n                this.trackingPixels\n                    .delete(pixelIds || this.datatable.selectedRows$.value)\n                    .subscribe(\n                        () => {\n                            this.datatable.reset();\n                            this.linkUsage.reload();\n                            this.toast.open(\n                                Messages.TRACKING_PIXEL_DELETE_SUCCESS\n                            );\n                        },\n                        (errResponse: BackendErrorResponse) => {\n                            this.toast.open(\n                                errResponse.message || HttpErrors.Default\n                            );\n                        }\n                    );\n            });\n    }\n\n    showCrupdatePixelModal(pixel?: TrackingPixel) {\n        this.datatable\n            .openCrupdateResourceModal(CrupdateTrackingPixelModalComponent, {\n                pixel,\n            })\n            .subscribe(() => {\n                this.linkUsage.reload();\n            });\n    }\n\n    showUserColumn(): boolean {\n        // show in admin and if active workspace is not personal\n        return this.activeSection.admin || !!this.workspaces.activeId$.value;\n    }\n\n    private setFilters() {\n        this.filters = TRACKING_PIXEL_FILTERS.filter(\n            f => f.key !== 'user_id' || this.showUserColumn()\n        );\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {ReplaySubject} from 'rxjs';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {GenericBackendResponse} from '@common/core/types/backend-response';\nimport {LinkUsageResponse} from './link-usage-response';\nimport {CrupdateLinkSelectValuesService} from '../../dashboard/link/crupdate-link-select-values.service';\n\nexport const LINK_USAGE_BASE_URI = 'link/usage';\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class LinkUsageService {\n    public response$ = new ReplaySubject<LinkUsageResponse>(1);\n\n    constructor(\n        private http: AppHttpClient,\n        private selectValues: CrupdateLinkSelectValuesService\n    ) {}\n\n    reload() {\n        this.selectValues.clearCache();\n        this.http\n            .get<GenericBackendResponse<LinkUsageResponse>>(\n                LINK_USAGE_BASE_URI,\n            )\n            .subscribe(response => {\n                this.response$.next(response);\n            });\n    }\n}\n","import { FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport {Injectable} from '@angular/core';\nimport {Link} from './link';\nimport {BehaviorSubject} from 'rxjs';\nimport {CrupdateLinkPayload} from './link.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport { LinkGroup } from './link-group';\n\ninterface LinkErrors extends Partial<Link> {\n    long_urls?: string;\n}\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class LinkForm {\n    formGroup: FormGroup;\n    errors$ = new BehaviorSubject<LinkErrors>({});\n\n    geoRules: FormArray;\n    deviceRules: FormArray;\n    platformRules: FormArray;\n    expClicksRule: FormGroup;\n\n    linkHash: FormControl;\n\n    constructor(private fb: FormBuilder, private settings: Settings) {\n        this.build();\n        this.linkHash = this.formGroup.get('hash') as FormControl;\n    }\n\n    value(): CrupdateLinkPayload {\n        const payload = {...this.formGroup.value};\n\n        // merge device / country rules and remove empty rules\n        payload.rules = (payload.geo_rules || [])\n            .concat(payload.device_rules)\n            .concat(payload.platform_rules)\n            .filter(rule => rule?.key && rule?.value);\n\n        // delete geo and device rule fields\n        delete payload.geo_rules;\n        delete payload.device_rules;\n        delete payload.platform_rules;\n\n        // split link type into type and type id values\n        if (payload.type.indexOf(':') > -1) {\n            payload.type_id = parseInt(payload.type.split(':')[1]);\n            payload.type = payload.type.split(':')[0];\n        }\n\n        if (payload.long_urls) {\n            payload.long_urls = payload.long_urls.split(/\\n/g);\n            // send only single url or multiple urls\n            delete payload.long_url;\n            delete payload.alias;\n        } else {\n            // make sure validation is not triggered with empty string\n            delete payload.long_urls;\n        }\n\n        // don't unset password if user did not make any changes to it\n        if (!this.formGroup.get('password').dirty) {\n            delete payload.password;\n        }\n\n        return payload;\n    }\n\n    private build() {\n        const defaultType = this.settings.get('links.default_type', 'direct');\n        this.formGroup = this.fb.group({\n            type: [defaultType],\n            name: [''],\n            long_url: [''],\n            long_urls: [''],\n            domain_id: [null],\n            hash: [''],\n            alias: [''],\n            image: [''],\n            utm: [''],\n            password: [''],\n            active: [true],\n            expires_at: [''],\n            activates_at: [''],\n            description: [''],\n            tags: [[]],\n            pixels: [[]],\n            groups: [[]],\n            geo_rules: this.fb.array([]),\n            device_rules: this.fb.array([]),\n            platform_rules: this.fb.array([]),\n            exp_clicks_rule: this.fb.group({\n                key: [''],\n                value: [''],\n            })\n        });\n\n        this.geoRules = this.formGroup.controls.geo_rules as FormArray;\n        this.deviceRules = this.formGroup.controls.device_rules as FormArray;\n        this.platformRules = this.formGroup.controls.platform_rules as FormArray;\n        this.expClicksRule = this.formGroup.controls.exp_clicks_rule as FormGroup;\n\n        this.addNewGeoRule();\n        this.addNewDeviceRule();\n        this.addNewPlatformRule();\n\n        this.formGroup.get('long_urls').valueChanges.subscribe(value => {\n            if (value) {\n                this.formGroup.get('alias').disable();\n            } else {\n                this.formGroup.get('alias').enable();\n            }\n        });\n    }\n\n    patchValue(link?: Link|LinkGroup) {\n        if (link) {\n            const value = {...link} as {[key: string]: any};\n            // type=overlay, type_id=1 => type=overlay:1\n            if ('type_id' in link && link.type_id) {\n                value.type = `${link.type}:${link.type_id}`;\n            }\n            const rules = link.rules || [];\n            value.geo_rules = rules.filter(r => r.type === 'geo');\n            value.device_rules = rules.filter(r => r.type === 'device');\n            value.platform_rules = rules.filter(r => r.type === 'platform');\n            value.exp_clicks_rule = rules.find(r => r.type === 'exp_clicks');\n            value.tags = (value.tags || []).map(t => t.name);\n            value.pixels = (value.pixels || []).map(p => p.id);\n            value.groups = (value.groups || []).map(p => p.id);\n\n            // show an indication to user that password exists\n            // even though we can't hydrate actual password\n            if (link.has_password) {\n                value.password = '******';\n            }\n\n            this.formGroup.patchValue(value);\n\n            if (value.geo_rules.length) {\n                this.geoRules.clear();\n                value.geo_rules.forEach(rule => {\n                    this.addNewGeoRule(rule.key, rule.value);\n                });\n            }\n            if (value.device_rules.length) {\n                this.deviceRules.clear();\n                value.device_rules.forEach(rule => {\n                    this.addNewDeviceRule(rule.key, rule.value);\n                });\n            }\n            if (value.platform_rules.length) {\n                this.platformRules.clear();\n                value.platform_rules.forEach(rule => {\n                    this.addNewPlatformRule(rule.key, rule.value);\n                });\n            }\n        }\n    }\n\n    addNewGeoRule(key: string = 'us', value: string = '') {\n        this.geoRules.push(this.fb.group({key: [key], value: [value], type: 'geo'}));\n    }\n\n    addNewDeviceRule(key: string = 'mobile', value: string = '') {\n        this.deviceRules.push(this.fb.group({key: [key], value: [value], type: 'device'}));\n    }\n\n    addNewPlatformRule(key: string = 'windows', value: string = '') {\n        this.platformRules.push(this.fb.group({key: [key], value: [value], type: 'platform'}));\n    }\n\n    setErrors(messages?: LinkErrors) {\n        this.errors$.next(messages || {});\n    }\n}\n","import { Injectable } from '@angular/core';\nimport {UploadValidator} from '@common/uploads/validation/upload-validator';\nimport {FileSizeValidation} from '@common/uploads/validation/validations/file-size-validation';\nimport {convertToBytes} from '@common/core/utils/convertToBytes';\nimport {FileTypeValidation} from '@common/uploads/validation/validations/file-type-validation';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class AppearanceImageUploadValidator extends UploadValidator {\n    protected readonly DEFAULT_MAX_SIZE_MB = 5;\n\n    protected initValidations() {\n        const validations = [\n            new FileSizeValidation(\n                {maxSize: convertToBytes(this.DEFAULT_MAX_SIZE_MB, 'MB')},\n                this.i18n\n            ),\n            new FileTypeValidation({types: ['image']}, this.i18n),\n        ];\n\n        this.validations.push(...validations);\n    }\n}\n","<div class=\"modal-header\">\n  <h2 mat-dialog-title trans>Find User</h2>\n  <button type=\"button\" (click)=\"close()\" class=\"no-style close-button\" tabindex=\"-1\">\n    <mat-icon svgIcon=\"close\"></mat-icon>\n  </button>\n</div>\n\n<mat-dialog-content>\n  <div class=\"input-container search-input-container\">\n    <input\n      type=\"text\"\n      placeholder=\"Search for user by name or email...\"\n      [formControl]=\"searchFormControl\"\n    />\n    <loading-indicator [isVisible]=\"loading$ | async\" class=\"small\"></loading-indicator>\n  </div>\n\n  <div class=\"users\">\n    <div class=\"user\" *ngFor=\"let user of users$ | async\" (click)=\"close(user)\">\n      <img [src]=\"user.avatar\" />\n      <div class=\"meta overflow-hidden\">\n        <div class=\"name overflow-hidden\">{{ user.display_name }}</div>\n        <div class=\"email overflow-hidden\">{{ user.email }}</div>\n      </div>\n    </div>\n  </div>\n</mat-dialog-content>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\nimport {FormControl} from '@angular/forms';\nimport {catchError, debounceTime, distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {BehaviorSubject, Observable, of} from 'rxjs';\nimport {Users} from '../users.service';\nimport {User} from '../../core/types/models/User';\nimport {NormalizedModel} from '@common/core/types/models/normalized-model';\n\n@Component({\n    selector: 'find-user-modal',\n    templateUrl: './find-user-modal.component.html',\n    styleUrls: ['./find-user-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FindUserModalComponent implements OnInit {\n    searchFormControl = new FormControl();\n    loading$ = new BehaviorSubject(false);\n    users$ = new BehaviorSubject<User[]>([]);\n\n    constructor(\n        private dialogRef: MatDialogRef<FindUserModalComponent>,\n        private users: Users\n    ) {}\n\n    ngOnInit() {\n        this.searchFormControl.valueChanges\n            .pipe(\n                debounceTime(250),\n                distinctUntilChanged(),\n                switchMap(query => this.searchUsers(query)),\n                catchError(() => of([]))\n            )\n            .subscribe(users => {\n                this.users$.next(users);\n                this.loading$.next(false);\n            });\n    }\n\n    close(user?: User) {\n        this.dialogRef.close(this.normalizeUser(user));\n    }\n\n    private searchUsers(query: string): Observable<User[]> {\n        this.loading$.next(true);\n        if (!query) {\n            return of([]);\n        }\n        return this.users.getAll({query});\n    }\n\n    private normalizeUser(user?: User): NormalizedModel {\n        if (user) {\n            return {\n                id: user.id,\n                name: user.display_name,\n                image: user.avatar,\n                model_type: user.model_type,\n            };\n        }\n        return null;\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {BetweenInputComponent} from './between-input/between-input.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ReactiveFormsModule} from '@angular/forms';\n\n@NgModule({\n    declarations: [BetweenInputComponent],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        ReactiveFormsModule,\n    ],\n    exports: [BetweenInputComponent]\n})\nexport class BetweenDateInputModule {\n}\n","<mat-chip-list #chipList [selectable]=\"false\">\n    <mat-chip\n        *ngFor=\"let item of items$ | async; index as i\"\n        [selectable]=\"false\"\n        [removable]=\"!selectMode\"\n        (removed)=\"remove(i)\"\n    >\n        {{displayChipValue(item)}}\n        <mat-icon matChipRemove svgIcon=\"cancel\"></mat-icon>\n    </mat-chip>\n    <input [placeholder]=\"placeholder | trans\"\n           *ngIf=\"!selectMode\"\n           #inputEl\n           [type]=\"type\"\n           class=\"mat-chip-input mat-input-element\"\n           [matChipInputFor]=\"chipList\"\n           [matChipInputAddOnBlur]=\"true\"\n           [matAutocomplete]=\"auto\"\n           [matAutocompleteConnectedTo]=\"{elementRef: el}\"\n           [formControl]=\"formControl\"\n           (matChipInputTokenEnd)=\"addFromChipInput($event.value)\" />\n</mat-chip-list>\n\n<mat-autocomplete class=\"chip-input-autocomplete-panel\" #auto=\"matAutocomplete\" (optionSelected)=\"addFromAutocomplete($event.option.value)\" [autoActiveFirstOption]=\"true\">\n    <mat-option *ngFor=\"let value of suggestedValues$ | async\" [value]=\"value\">{{displayChipValue(value)}}</mat-option>\n</mat-autocomplete>\n\n<ng-template #selectModeTemplate let-suggestions=\"suggestions\">\n    <mat-option *ngFor=\"let value of suggestions\" [value]=\"value\">{{displayChipValue(value)}}</mat-option>\n</ng-template>\n","import {\n    AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, OnInit, TemplateRef, ViewChild, ViewEncapsulation\n} from '@angular/core';\nimport {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject, Observable, of} from 'rxjs';\nimport {MatAutocomplete} from '@angular/material/autocomplete';\nimport {catchError, debounceTime, distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {Model} from '../../../types/models/model';\n\ntype ChipValue = 'string' | Model;\n\n@Component({\n    selector: 'chip-input',\n    templateUrl: './chip-input.component.html',\n    styleUrls: ['./chip-input.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: ChipInputComponent,\n        multi: true,\n    }]\n})\nexport class ChipInputComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n    @Input() placeholder: string;\n    @Input() type = 'text';\n    @Input() emailsInput = false;\n    @Input() suggestFn: (query: string) => Observable<ChipValue[]>;\n    @Input() @HostBinding('class.select-mode') selectMode = false;\n    @ViewChild('auto') matAutocomplete: MatAutocomplete;\n    @ViewChild('inputEl') inputEl: ElementRef<HTMLInputElement>;\n    @ViewChild('selectModeTemplate') selectModeTemplate: TemplateRef<any>;\n\n    public formControl = new FormControl();\n\n    public propagateChange: (items: ChipValue[]) => void;\n    public items$ = new BehaviorSubject<ChipValue[]>([]);\n    public suggestedValues$ = new BehaviorSubject<ChipValue[]>([]);\n    @Input() set suggestedValues(values: ChipValue[]) {\n        this.suggestedValues$.next(values);\n    }\n\n    constructor(\n        public el: ElementRef<HTMLElement>,\n    ) {}\n\n    ngOnInit() {\n        if (this.suggestFn) {\n            this.bindToSearchControl();\n        }\n        if (this.selectMode) {\n           // TODO: implement\n        }\n    }\n\n    ngAfterViewInit() {\n        if (this.emailsInput) {\n            this.parseEmailsOnPaste();\n        }\n    }\n\n    public remove(index: number) {\n        const items = [...this.items$.value];\n        items.splice(index, 1);\n        this.items$.next(items);\n        this.propagateChange(this.items$.value);\n    }\n\n    public addFromChipInput(value: ChipValue, propagate = true) {\n        if (value && !this.matAutocomplete.isOpen && !this.selectMode) {\n            this.add(value, propagate);\n        }\n    }\n\n    public addFromAutocomplete(value: ChipValue, propagate = true) {\n        this.add(value, propagate);\n    }\n\n    private add(value: ChipValue, propagate = true) {\n        value = (typeof value === 'string' ? value.trim() : value) as ChipValue;\n        const duplicate = this.findValueIndex(value) > -1;\n        if (value && !duplicate) {\n            this.items$.next([...this.items$.value, value]);\n            if (propagate) {\n                this.propagateChange(this.items$.value);\n            }\n        }\n        if (this.inputEl) {\n            this.inputEl.nativeElement.value = '';\n        }\n        this.formControl.setValue(null);\n        this.suggestedValues$.next([]);\n    }\n\n    private findValueIndex(value: ChipValue) {\n        if (typeof value === 'string') {\n            return this.items$.value.indexOf(value);\n        } else {\n            return this.items$.value.findIndex(v => (v as Model).id === value.id);\n        }\n    }\n\n    public writeValue(value: ChipValue[] = []) {\n        this.items$.next(value || []);\n        // if (value && value.length) {\n        //     value.forEach(item => this.add(item, false));\n        // } else if (this.items$.value.length) {\n        //     while (this.items$.value.length !== 0) {\n        //         this.remove(0);\n        //     }\n        // }\n    }\n\n    public registerOnChange(fn: (items: ChipValue[]) => void) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n\n    private bindToSearchControl() {\n        this.formControl.valueChanges.pipe(\n            debounceTime(150),\n            distinctUntilChanged(),\n            switchMap(query => query ? this.suggestFn(query) : of([])),\n            catchError(() => of([])),\n        ).subscribe(values => {\n            const filtered = values.filter(v => this.findValueIndex(v) === -1);\n            this.suggestedValues$.next(filtered);\n        });\n    }\n\n    public displayChipValue(value: ChipValue): string {\n        return typeof value === 'object' ? value.name : value;\n    }\n\n    private parseEmailsOnPaste() {\n        this.inputEl.nativeElement.addEventListener('paste', e => {\n            const paste = (e.clipboardData || window['clipboardData']).getData('text');\n            const emails = paste.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\\.[a-zA-Z0-9._-]+)/gi);\n            if (emails) {\n                e.preventDefault();\n                const selection = window.getSelection();\n                if (selection.rangeCount) {\n                    selection.deleteFromDocument();\n                    emails.forEach(email => this.add(email));\n                }\n            }\n        });\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ChipInputComponent} from './chip-input/chip-input.component';\nimport {MatChipsModule} from '@angular/material/chips';\nimport {MatIconModule} from '@angular/material/icon';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatRippleModule} from '@angular/material/core';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        MatChipsModule,\n        MatAutocompleteModule,\n        ReactiveFormsModule,\n        TranslationsModule,\n\n        MatButtonModule,\n        MatIconModule,\n        MatRippleModule,\n    ],\n    declarations: [\n        ChipInputComponent,\n    ],\n    exports: [\n        ChipInputComponent,\n    ]\n})\nexport class ChipsModule {\n}\n","import {ChangeDetectionStrategy, Component, ElementRef, OnDestroy} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BOTTOM_POSITION} from '@common/core/ui/overlay-panel/positions/bottom-position';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {BehaviorSubject, Subscription} from 'rxjs';\n\n@Component({\n    selector: 'color-picker-input',\n    templateUrl: './color-picker-input.component.html',\n    styleUrls: ['./color-picker-input.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: ColorPickerInputComponent,\n        multi: true,\n    }]\n})\nexport class ColorPickerInputComponent implements OnDestroy, ControlValueAccessor {\n    private pickerSub: Subscription;\n    public propagateChange: Function;\n    public color$ = new BehaviorSubject(null);\n\n    constructor(\n        private overlayPanel: OverlayPanel,\n    ) {}\n\n    public ngOnDestroy(): void {\n        this.pickerSub && this.pickerSub.unsubscribe();\n    }\n\n    public writeValue(value: string) {\n        this.color$.next(value);\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n\n    public async openColorPicker(e: MouseEvent) {\n        const { BeColorPickerModule } = await import('@common/core/ui/color-picker/be-color-picker.module');\n        this.pickerSub = this.overlayPanel.open(\n            BeColorPickerModule.components.panel,\n            {\n                origin: new ElementRef(e.target),\n                position: BOTTOM_POSITION,\n                data: {color: this.color$.value}\n            }\n        ).valueChanged().subscribe(color => {\n            this.color$.next(color);\n            this.propagateChange(this.color$.value);\n        });\n    }\n}\n","<button type=\"button\" matRipple class=\"no-style color-picker-btn\" (click)=\"openColorPicker($event)\">\n    <mat-icon svgIcon=\"drop-custom\" class=\"color-icon\" [style.color]=\"color$ | async\"></mat-icon>\n    <span class=\"name\" trans><ng-content></ng-content></span>\n    <span class=\"change\" trans>Change</span>\n</button>\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ColorPickerInputComponent} from '@common/core/ui/color-picker/color-picker-input/color-picker-input.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport { MatRippleModule } from '@angular/material/core';\n\n\n@NgModule({\n    declarations: [ColorPickerInputComponent],\n    imports: [CommonModule, TranslationsModule, MatIconModule, MatRippleModule],\n    exports: [ColorPickerInputComponent],\n})\nexport class ColorPickerInputModule {}\n","<fieldset [formGroup]=\"form\">\n    <legend>\n        <span class=\"legend-label\">\n            <ng-content></ng-content>\n        </span>\n        <button\n          *ngIf=\"!form.disabled\"\n          class=\"clear-btn\"\n          type=\"button\"\n          (click)=\"clearValue()\"\n          mat-button\n          trans\n        >\n            Clear\n        </button>\n    </legend>\n    <div class=\"inline-inputs-container\">\n        <div class=\"input-container\">\n            <label [for]=\"id + '-date'\" class=\"hidden\" trans>Date</label>\n            <input\n                type=\"date\"\n                [id]=\"id + '-date'\"\n                class=\"date-input\"\n                formControlName=\"date\"\n                [placeholder]=\"currentDate\"\n            />\n        </div>\n        <div class=\"input-container\">\n            <label [for]=\"id + '-time'\" class=\"hidden\" trans>Time</label>\n            <input\n                type=\"time\"\n                [id]=\"id + '-time'\"\n                class=\"time-input\"\n                formControlName=\"time\"\n                [placeholder]=\"currentTime\"\n            />\n        </div>\n    </div>\n</fieldset>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input } from '@angular/core';\nimport {\n    ControlValueAccessor,\n    FormBuilder,\n    NG_VALUE_ACCESSOR,\n} from '@angular/forms';\nimport { val } from 'cheerio/lib/api/attributes';\n\n@Component({\n    selector: 'datetime-input',\n    templateUrl: './datetime-input.component.html',\n    styleUrls: ['./datetime-input.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: DatetimeInputComponent,\n            multi: true,\n        },\n    ],\n})\nexport class DatetimeInputComponent implements ControlValueAccessor {\n    @Input() id: string;\n    @Input() currentDateAsDefault = false;\n\n    currentDate: string;\n    currentTime: string;\n    private initiated = false;\n\n    private propagateChange: Function;\n    form = this.fb.group({\n        date: [''],\n        time: [''],\n    });\n\n    constructor(private fb: FormBuilder, private cd: ChangeDetectorRef) {\n        this.setCurrentDatetime();\n    }\n\n    writeValue(value: string) {\n        value = (value || '').replace('Z', '');\n        let [date, time] = value.includes('T') ? value.split('T') : value.split(' ');\n        time = time ? time.substr(0, 5) : '';\n\n        if (!this.initiated && this.currentDateAsDefault) {\n            date = date || this.currentDate;\n            time = time || this.currentTime;\n        }\n\n        this.initiated = true;\n        this.form.patchValue({date, time});\n    }\n\n    registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n        this.form.valueChanges.subscribe(value => {\n            let datetime: string;\n            if ( ! value.date) {\n                datetime = null;\n            } else {\n                if (!value.time) {\n                    value.time = '00:00';\n                }\n                datetime = `${value.date} ${value.time}`;\n                // add seconds, if don't already exist\n                if (datetime.split(':').length === 2) {\n                    datetime += ':00';\n                }\n            }\n            this.propagateChange(datetime);\n        });\n    }\n\n    registerOnTouched() {}\n\n    setDisabledState(isDisabled: boolean) {\n        if (isDisabled) {\n            this.form.disable();\n        } else {\n            this.form.enable();\n        }\n        this.cd.markForCheck();\n    }\n\n    clearValue() {\n        this.form.patchValue({\n            date: null,\n            time: null,\n        });\n    }\n\n    private setCurrentDatetime() {\n        const [date, time] = new Date()\n            .toISOString()\n            .replace('Z', '')\n            .split('T');\n        const [hours, minutes] = time.split(':');\n        this.currentDate = date;\n        this.currentTime = `${hours}:${minutes}`;\n    }\n}\n","<button type=\"button\" mat-icon-button (click)=\"togglePopover()\" (mouseenter)=\"openPopover()\" (mouseleave)=\"onMouseLeave($event)\">\n    <mat-icon #infoIcon svgIcon=\"info\" class=\"info-icon\"></mat-icon>\n</button>\n\n<ng-template #popoverContent>\n    <ng-content></ng-content>\n</ng-template>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef, Input,\n    TemplateRef,\n    ViewChild,\n    ViewContainerRef,\n    ViewEncapsulation\n} from '@angular/core';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\n\n@Component({\n    selector: 'info-popover',\n    templateUrl: './info-popover.component.html',\n    styleUrls: ['./info-popover.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n})\nexport class InfoPopoverComponent {\n    @ViewChild('infoIcon', { read: ElementRef }) infoButton: ElementRef<HTMLElement>;\n    @ViewChild('popoverContent') content: TemplateRef<any>;\n    @Input() wider: boolean;\n    private overlayRef: OverlayPanelRef;\n\n    constructor(\n        private overlay: OverlayPanel,\n        private viewContainerRef: ViewContainerRef,\n    ) {}\n\n    public openPopover() {\n        if (this.overlayRef) {\n            this.closePopover();\n        }\n        const position = {...RIGHT_POSITION};\n        position[0].offsetY = -15;\n\n        this.overlayRef = this.overlay.open(this.content, {\n            origin: this.infoButton,\n            position: RIGHT_POSITION,\n            hasBackdrop: false,\n            scrollStrategy: 'close',\n            viewContainerRef: this.viewContainerRef,\n            panelClass: ['info-popover-panel', this.wider ? 'wider' : null],\n        });\n\n        this.overlayRef.getPanelEl().addEventListener('mouseleave', () => {\n            this.closePopover();\n        });\n    }\n\n    public closePopover() {\n        if (this.overlayRef) {\n            this.overlayRef.close();\n            this.overlayRef = null;\n        }\n    }\n\n    public togglePopover() {\n        if (this.overlayRef) {\n            this.closePopover();\n        } else {\n            this.openPopover();\n        }\n    }\n\n    public onMouseLeave(e: MouseEvent) {\n        const toElement = (e['toElement'] || e.relatedTarget) as HTMLElement;\n        if ( !toElement || !toElement.classList.contains('info-popover-panel')) {\n            this.closePopover();\n        }\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {InfoPopoverComponent} from '@common/core/ui/info-popover/info-popover.component';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\n\n@NgModule({\n    declarations: [InfoPopoverComponent],\n    imports: [\n        CommonModule,\n\n        // material\n        MatIconModule,\n        MatButtonModule,\n    ],\n    exports: [InfoPopoverComponent],\n})\nexport class InfoPopoverModule {}\n","import { ConnectedPosition } from '@angular/cdk/overlay';\n\nexport const RIGHT_POSITION: ConnectedPosition[] = [\n    {originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 5},\n    {originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: 5},\n];\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SelectUserInputComponent} from './select-user-input/select-user-input.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\n\n@NgModule({\n    declarations: [SelectUserInputComponent],\n    imports: [\n        CommonModule,\n        MatButtonModule,\n        MatMenuModule,\n        TranslationsModule,\n        ReactiveFormsModule,\n        MatIconModule,\n        LoadingIndicatorModule,\n    ],\n    exports: [\n        SelectUserInputComponent\n    ],\n})\nexport class SelectUserInputModule {\n}\n","import {animate, style, transition, trigger} from '@angular/animations';\n\nexport const SKELETON_ANIMATIONS = [\n    trigger('fadeIn', [\n        transition(':enter', [\n            style({opacity: 0}),\n            animate('325ms ease-in', style({\n                opacity: 1,\n            }))\n        ])\n    ]),\n    trigger('fadeOut', [\n        transition(':leave', [\n            style({opacity: 1, position: 'absolute', left: '0', right: '0'}),\n            animate('325ms ease-out', style({\n                opacity: 0\n            }))\n        ])\n    ])\n];\n","export function removeNullFromObject<T>(obj: T): T {\n    const copy = {...obj};\n    Object.keys(copy).forEach(key => {\n        if (copy[key] == null || copy[key] === '') {\n            delete copy[key];\n        }\n    });\n    return copy;\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\n\n@Component({\n    selector: 'csv-export-info-dialog',\n    templateUrl: './csv-export-info-dialog.component.html',\n    styleUrls: ['./csv-export-info-dialog.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CsvExportInfoDialogComponent {\n    constructor(\n        private dialogRef: MatDialogRef<CsvExportInfoDialogComponent>,\n    ) {}\n\n    public close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n    <h2 class=\"modal-title\" mat-dialog-title>CSV Export</h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<div class=\"mat-dialog-contents\" mat-dialog-content>\n    <div class=\"message-container\">\n        <mat-icon svgIcon=\"check\" class=\"success-icon\" color=\"su\"></mat-icon>\n        <div trans>\n            Your request is being processed. We'll email you when the report is ready to download. In\n            certain cases, it might take a little longer, depending on the number of items beings\n            exported and the volume of activity.\n        </div>\n    </div>\n</div>\n\n<div class=\"buttons right mat-dialog-actions\" mat-dialog-actions>\n    <button\n        mat-raised-button\n        color=\"accent\"\n        class=\"button primary submit-button\"\n        cdkFocusInitial\n        (click)=\"close()\"\n        trans\n    >\n        Got it\n    </button>\n</div>\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {downloadFileFromUrl} from '@common/uploads/utils/download-file-from-url';\nimport {CsvExportInfoDialogComponent} from '@common/csv/csv-info-dialog/csv-export-info-dialog.component';\n\nexport interface CsvExportResponse {\n    downloadPath?: string;\n    result?: 'jobQueued';\n}\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class CsvExporterService {\n    constructor(private http: AppHttpClient, private modal: Modal) {}\n\n    export(url: string, params: object = {}) {\n        return this.http.post(url, params).subscribe((response: CsvExportResponse) => {\n          if (response.downloadPath) {\n            downloadFileFromUrl(response.downloadPath);\n          } else {\n            this.modal.open(CsvExportInfoDialogComponent);\n          }\n      });\n    }\n}\n","/**\n * Download file from specified url.\n */\nexport function downloadFileFromUrl(url: string, name?: string) {\n    const link = document.createElement('a');\n    link.href = url;\n    if (name) link.download = name;\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n}\n","import {NgModule} from '@angular/core';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {CsvExportInfoDialogComponent} from './csv-export-info-dialog.component';\nimport {TranslationsModule} from '../../core/translations/translations.module';\n\n@NgModule({\n    declarations: [CsvExportInfoDialogComponent],\n    imports: [\n        TranslationsModule,\n\n        MatIconModule,\n        MatButtonModule,\n        MatDialogModule,\n    ],\n    exports: [CsvExportInfoDialogComponent],\n})\nexport class CsvExportInfoDialogModule {}\n","import {\n    DatatableFilter,\n    FilterControlType,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {FindUserModalComponent} from '@common/auth/find-user-modal/find-user-modal.component';\nimport {\n    CreatedAtFilter,\n    UpdatedAtFilter,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\n\nexport const CUSTOM_DOMAIN_FILTERS: DatatableFilter[] = [\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'global',\n        defaultValue: false,\n        description: 'Whether domain is set as global or not',\n        options: [\n            {key: 'No', value: false},\n            {key: 'Yes', value: true},\n        ],\n    }),\n    new UpdatedAtFilter({\n        description: 'Date the domain was last updated',\n    }),\n    new CreatedAtFilter({\n        description: 'Date the domain was created',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'user_id',\n        label: 'User',\n        description: 'User domain was created by',\n        component: FindUserModalComponent,\n    }),\n];\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Connect Domain</h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form (ngSubmit)=\"nextStep()\" ngNativeValidate [formGroup]=\"form\" *ngIf=\"errors$ | async as errors\">\n    <ng-container *ngIf=\"currentStep$ | async as currentStep\">\n        <mat-dialog-content>\n            <div class=\"host-step\" *ngIf=\"currentStep === Steps.Host\">\n                <div class=\"input-container\">\n                    <label for=\"host\" trans>Host</label>\n                    <input\n                        type=\"text\"\n                        id=\"host\"\n                        formControlName=\"host\"\n                        class=\"host-input\"\n                        placeholder=\"https://example.com\"\n                        maxlength=\"100\"\n                        required\n                    />\n                    <p trans>\n                        Enter the exact domain name you want your\n                        {{ data.resourceName || 'links' }} to be accessible with. It can be a\n                        subdomain (example.yourdomain.com) or root domain (yourdomain.com).\n                    </p>\n                    <div class=\"error\" *ngIf=\"errors.host\">{{ errors.host }}</div>\n                </div>\n\n                <div class=\"setting-toggle-container global-toggle\" *ngIf=\"insideAdmin()\">\n                    <mat-slide-toggle id=\"global\" formControlName=\"global\" trans\n                        >Global</mat-slide-toggle\n                    >\n                    <p trans>Whether all users should be able to select this domain.</p>\n                </div>\n            </div>\n\n            <div class=\"info-step\" *ngIf=\"currentStep === Steps.Info\">\n                <ng-container *ngIf=\"isSubdomain$ | async\">\n                    <p trans>\n                        Add this CNAME record to your domain by visiting your DNS provider or\n                        registrar.\n                    </p>\n                    <div class=\"message-widget\">\n                        <div class=\"message\"><strong>CNAME</strong> {{ baseUrl() }}</div>\n                    </div>\n                </ng-container>\n                <ng-container *ngIf=\"!(isSubdomain$ | async)\">\n                    <p trans>\n                        Add this A record to your domain by visiting your DNS provider or registrar.\n                    </p>\n                    <div class=\"message-widget\">\n                        <div class=\"message\"><strong>A</strong> {{ serverIp }}</div>\n                    </div>\n                </ng-container>\n            </div>\n\n            <div class=\"validate-step\" *ngIf=\"currentStep === Steps.Validate\">\n                <div class=\"message-widget\" *ngIf=\"loading$ | async; else notLoading\">\n                    <loading-indicator class=\"small icon\" [isVisible]=\"true\"></loading-indicator>\n                    <div class=\"message\" trans>Checking DNS configuration...</div>\n                </div>\n                <ng-template #notLoading>\n                    <div class=\"message-widget warning-color\">\n                        <mat-icon svgIcon=\"warning\" class=\"icon\"></mat-icon>\n                        <div\n                            class=\"message\"\n                            *ngIf=\"\n                                (validationFailReason$ | async) === 'serverNotConfigured' &&\n                                    currentUserIsAdmin;\n                                else dnsNotSetup\n                            \"\n                            trans\n                            [transValues]=\"{host: form.value.host}\"\n                        >\n                            DNS records for the domain are setup, however it seems that your server\n                            is not configured to handle requests from \"host\"\n                        </div>\n                        <ng-template #dnsNotSetup>\n                            <div\n                                class=\"message\"\n                                trans\n                                [transValues]=\"{location: (isSubdomain$ | async) ? baseUrl() : serverIp}\"\n                            >\n                                The domain is missing {{ (isSubdomain$ | async) ? 'CNAME' : 'A' }} record\n                                pointing to :location or the changes haven't propagated yet.\n                            </div>\n                        </ng-template>\n                    </div>\n                    <p>\n                        {{ 'You can wait and try again later or' | trans }}\n                        <button\n                            class=\"no-style refresh-btn\"\n                            type=\"button\"\n                            [disabled]=\"loading$ | async\"\n                            (click)=\"validateDnsForDomain()\"\n                            trans\n                        >\n                            refresh\n                        </button>\n                    </p>\n                </ng-template>\n            </div>\n\n            <div class=\"finalize-step\" *ngIf=\"currentStep === Steps.Finalize\">\n                <div class=\"message-widget\">\n                    <loading-indicator class=\"small icon\" [isVisible]=\"true\"></loading-indicator>\n                    <div class=\"message\" trans>Connecting domain...</div>\n                </div>\n                <p trans>Don't close this window until domain is connected.</p>\n            </div>\n        </mat-dialog-content>\n\n        <mat-dialog-actions>\n            <button (click)=\"close()\" type=\"button\" class=\"cancel-button\" mat-button trans>\n                Cancel\n            </button>\n            <div class=\"submit-btns\">\n                <button\n                    mat-button\n                    color=\"accent\"\n                    class=\"step-btn\"\n                    type=\"button\"\n                    (click)=\"previousStep()\"\n                    *ngIf=\"currentStep > 1\"\n                    trans\n                >\n                    <mat-icon svgIcon=\"keyboard-arrow-left\" class=\"step-icon\"></mat-icon>\n                    Previous\n                </button>\n                <button\n                    type=\"submit\"\n                    mat-raised-button\n                    class=\"step-btn\"\n                    color=\"accent\"\n                    [disabled]=\"(loading$ | async) || (disabled$ | async)\"\n                    trans\n                >\n                    Next <mat-icon svgIcon=\"keyboard-arrow-right\" class=\"step-icon\"></mat-icon>\n                </button>\n            </div>\n        </mat-dialog-actions>\n    </ng-container>\n</form>\n","import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {FormControl, FormGroup} from '@angular/forms';\nimport {CustomDomainService} from '../custom-domain.service';\nimport {CustomDomain} from '../custom-domain';\nimport {finalize} from 'rxjs/operators';\nimport {Settings} from '@common/core/config/settings.service';\nimport {Router} from '@angular/router';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport { CurrentUser } from '@common/auth/current-user';\n\ninterface CrupdateCustomDomainModalData {\n    domain: CustomDomain;\n    resourceName: string;\n}\n\ntype FailReason = 'serverNotConfigured' | 'dnsNotSetup';\n\nenum Steps {\n    Host = 1,\n    Info = 2,\n    Validate = 3,\n    Finalize = 4,\n}\n\n@Component({\n    selector: 'crupdate-custom-domain-modal',\n    templateUrl: './crupdate-custom-domain-modal.component.html',\n    styleUrls: ['./crupdate-custom-domain-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CrupdateCustomDomainModalComponent implements OnInit {\n    Steps = Steps;\n    serverIp: string;\n    currentStep$ = new BehaviorSubject<number>(1);\n    loading$ = new BehaviorSubject(false);\n    disabled$ = new BehaviorSubject(false);\n    updating$ = new BehaviorSubject(false);\n    errors$ = new BehaviorSubject<{host?: string}>({});\n    validationFailReason$ = new BehaviorSubject<FailReason>(null);\n    isSubdomain$ = new BehaviorSubject<boolean>(false);\n    form = new FormGroup({\n        host: new FormControl(),\n        global: new FormControl(false),\n    });\n    currentUserIsAdmin: boolean;\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateCustomDomainModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateCustomDomainModalData,\n        private customDomains: CustomDomainService,\n        private toast: Toast,\n        private settings: Settings,\n        private router: Router,\n        private currentUser: CurrentUser\n    ) {\n        this.updating$.next(!!data.domain);\n        this.currentUserIsAdmin = this.currentUser.isAdmin();\n        if (data.domain) {\n            this.form.patchValue(data.domain);\n        }\n    }\n\n    ngOnInit() {\n        this.form.get('host').valueChanges.subscribe(value => {\n            this.isSubdomain$.next((value.replace('www.', '').match(/\\./g) || []).length > 1);\n        });\n    }\n\n    private connectDomain() {\n        this.loading$.next(true);\n        const request = this.updating$.value\n            ? this.customDomains.update(this.data.domain.id, this.form.value)\n            : this.customDomains.create(this.form.value);\n\n        request.pipe(finalize(() => this.loading$.next(false))).subscribe(\n            response => {\n                this.toast.open('Domain connected');\n                this.close(response.domain);\n            },\n            (errResponse: BackendErrorResponse) => {\n                this.errors$.next(errResponse.errors);\n            }\n        );\n    }\n\n    public validateDnsForDomain() {\n        this.disabled$.next(true);\n        this.loading$.next(true);\n        this.customDomains\n            .validate(this.form.value.host)\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(\n                response => {\n                    if (response && response.result === 'connected') {\n                        this.nextStep();\n                    }\n                },\n                (\n                    errResponse: BackendErrorResponse & {\n                        failReason?: FailReason;\n                    }\n                ) => {\n                    this.validationFailReason$.next(errResponse.failReason);\n                }\n            );\n    }\n\n    private authorizeCrupdate() {\n        this.loading$.next(true);\n        const payload = {...this.form.value};\n        if (this.data.domain) {\n            payload.domainId = this.data.domain.id;\n        }\n        this.customDomains\n            .authorizeCrupdate(payload)\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(\n                response => {\n                    this.serverIp = response.serverIp;\n                    this.nextStep(true);\n                },\n                (errResponse: BackendErrorResponse) =>\n                    this.errors$.next(errResponse.errors)\n            );\n    }\n\n    public close(domain?: CustomDomain) {\n        this.dialogRef.close(domain);\n    }\n\n    public previousStep() {\n        if (this.currentStep$.value > Steps.Host) {\n            this.currentStep$.next(this.currentStep$.value - 1);\n        }\n    }\n\n    public nextStep(skipAuthorize = false) {\n        // run authorization before asking user to change their DNS\n        // in case they don't have permissions to create new domains\n        if (this.currentStep$.value === Steps.Host && !skipAuthorize) {\n            return this.authorizeCrupdate();\n        }\n\n        this.currentStep$.next(this.currentStep$.value + 1);\n        if (this.currentStep$.value === Steps.Validate) {\n            // host did not change, no need to re-validate\n            if (\n                this.data.domain &&\n                this.form.value.host === this.data.domain.host\n            ) {\n                this.connectDomain();\n            } else {\n                this.validateDnsForDomain();\n            }\n        } else if (this.currentStep$.value === Steps.Finalize) {\n            this.connectDomain();\n        } else {\n            //\n        }\n    }\n\n    public baseUrl(): string {\n        return this.settings.getBaseUrl().replace(/\\/$/, '');\n    }\n\n    public insideAdmin(): boolean {\n        return this.router.url.indexOf('admin') > -1;\n    }\n}\n","<div class=\"datatable-page-header\">\n  <h1 trans>Custom Domains</h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"domains\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <button\n        mat-raised-button\n        color=\"accent\"\n        [disabled]=\"!currentUser.hasPermission('custom_domains.create')\"\n        (click)=\"showCrupdateDomainModal()\"\n        class=\"button-with-icon\"\n      >\n        <mat-icon svgIcon=\"add\"></mat-icon>\n        <span trans>Connect New Domain</span>\n      </button>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Host</th>\n        <th *ngIf=\"showUserColumn()\" table-sort-header=\"user_id\" trans>Owner</th>\n        <th table-sort-header trans>Global</th>\n        <th table-sort-header=\"updated_at\" trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"6\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'domain(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <button\n              type=\"button\"\n              mat-raised-button\n              color=\"warn\"\n              [disabled]=\"!currentUser.hasPermission('custom_domains.delete')\"\n              (click)=\"maybeDeleteSelectedDomains()\"\n              trans\n            >\n              Delete\n            </button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let domain of domains$ | async\">\n        <td [table-body-checkbox]=\"domain.id\"></td>\n        <td data-label=\"Host\">\n          <img class=\"favicon-img\" [src]=\"domain.host | favicon\" alt=\"\" />\n          <span>{{ domain.host }}</span>\n        </td>\n        <td data-label=\"Owner\" *ngIf=\"showUserColumn()\">\n          <user-column [user]=\"domain.user\"></user-column>\n        </td>\n        <td data-label=\"Global\">{{ domain.global ? 'Yes' : 'No' }}</td>\n        <td data-label=\"Updated At\">{{ domain.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <button\n            mat-icon-button\n            (click)=\"showCrupdateDomainModal(domain)\"\n            [matTooltip]=\"'Edit domain' | trans\"\n          >\n            <mat-icon svgIcon=\"edit\"></mat-icon>\n          </button>\n          <button\n            class=\"visible-on-mobile\"\n            type=\"button\"\n            mat-icon-button\n            (click)=\"maybeDeleteSelectedDomains([domain.id])\"\n            trans\n          >\n            <mat-icon svgIcon=\"delete\"></mat-icon>\n          </button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"custom-domain.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No custom domains have been added yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {Router} from '@angular/router';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {DatatableService} from '../../datatable/datatable.service';\nimport {CrupdateCustomDomainModalComponent} from '../crupdate-custom-domain-modal/crupdate-custom-domain-modal.component';\nimport {CustomDomain} from '../custom-domain';\nimport {CustomDomainService} from '../custom-domain.service';\nimport {Observable} from 'rxjs';\nimport {CUSTOM_DOMAIN_FILTERS} from '@common/custom-domain/custom-domain-index/custom-domain-filters';\n\n@Component({\n    selector: 'custom-domain-index',\n    templateUrl: './custom-domain-index.component.html',\n    styleUrls: ['./custom-domain-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class CustomDomainIndexComponent implements OnInit {\n    filters = CUSTOM_DOMAIN_FILTERS;\n    domains$ = this.datatable.data$ as Observable<CustomDomain[]>;\n    constructor(\n        public datatable: DatatableService<CustomDomain>,\n        public currentUser: CurrentUser,\n        protected customDomains: CustomDomainService,\n        protected toast: Toast,\n        protected router: Router\n    ) {}\n\n    ngOnInit() {\n        this.datatable.init({\n            uri: CustomDomainService.BASE_URI,\n        });\n    }\n\n    public maybeDeleteSelectedDomains(domainIds?: number[]) {\n        this.datatable.confirmResourceDeletion('domains').subscribe(() => {\n            this.customDomains\n                .delete(domainIds || this.datatable.selectedRows$.value)\n                .subscribe(\n                    () => {\n                        this.datatable.reset();\n                        this.toast.open('Domains deleted.');\n                    },\n                    (errResponse: BackendErrorResponse) => {\n                        this.toast.open(\n                            errResponse.message || HttpErrors.Default\n                        );\n                    }\n                );\n        });\n    }\n\n    public showCrupdateDomainModal(domain?: CustomDomain) {\n        this.datatable\n            .openCrupdateResourceModal(CrupdateCustomDomainModalComponent, {\n                domain,\n            })\n            .subscribe();\n    }\n\n    public showUserColumn(): boolean {\n        return this.router.url.indexOf('admin') > -1;\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {CustomDomain} from './custom-domain';\nimport {PaginationParams} from '@common/core/types/pagination/pagination-params';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class CustomDomainService {\n    static BASE_URI = 'custom-domain';\n    constructor(private http: AppHttpClient) {\n    }\n\n    public index(params: (PaginationParams & {userId?: number}) = {}): PaginatedBackendResponse<CustomDomain> {\n        return this.http.get(`${CustomDomainService.BASE_URI}`, params);\n    }\n\n    public create(params: {host: string}): BackendResponse<{ domain: CustomDomain }> {\n        return this.http.post(CustomDomainService.BASE_URI, params);\n    }\n\n    public update(id: number, params: {host?: string, resource_type?: string, resource_id?: number}): BackendResponse<{ domain: CustomDomain }> {\n        return this.http.put(`${CustomDomainService.BASE_URI}/${id}`, params);\n    }\n\n    public delete(ids: number[]): BackendResponse<void> {\n        return this.http.delete(`${CustomDomainService.BASE_URI}/${ids}`);\n    }\n\n    public validate(host: string): BackendResponse<{result: 'connected'|null}> {\n        return this.http.post(`${CustomDomainService.BASE_URI}/validate/2BrM45vvfS/api`, {host});\n    }\n\n    public authorizeCrupdate(params: {host: string, domainId?: number}): BackendResponse<{serverIp: string}> {\n        return this.http.post(`${CustomDomainService.BASE_URI}/authorize/store`, params);\n    }\n}\n","<ng-container *ngIf=\"user\">\n    <img [src]=\"user.avatar\" alt=\"\">\n    <a [routerLink]=\"url.generate(user)\" target=\"_blank\" class=\"link content\" *ngIf=\"haveUrl\">\n        <div>{{user.display_name}}</div>\n        <div class=\"email secondary\">{{user.email}}</div>\n    </a>\n    <div class=\"content\" *ngIf=\"!haveUrl\">\n        <div>{{user.display_name}}</div>\n        <div class=\"email secondary\">{{user.email}}</div>\n    </div>\n</ng-container>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {User} from '@common/core/types/models/User';\nimport {UrlGeneratorService} from '@common/core/services/url-generator.service';\n\n@Component({\n    selector: 'user-column',\n    templateUrl: './user-column.component.html',\n    styleUrls: ['./user-column.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {class: 'column-with-image'},\n})\nexport class UserColumnComponent {\n    @Input() user: User;\n    @Input() showEmail = false;\n    haveUrl: boolean;\n\n    constructor(public url: UrlGeneratorService) {\n        this.haveUrl = !!url['user'];\n    }\n}\n","<div class=\"table\">\n  <div class=\"filter-suggestion-header row\">\n    <div class=\"column\" trans>Field</div>\n    <div class=\"column\" trans>Description</div>\n  </div>\n  <div class=\"body\" role=\"list\">\n    <div\n      role=\"listitem\"\n      class=\"row filter-suggestion-item\"\n      *ngFor=\"let filter of filters | keyvalue: originalOrder; index as index\"\n      tabindex=\"0\"\n      #filterSuggestion\n      [attr.data-filter-key]=\"filter.key\"\n      [attr.data-index]=\"index\"\n      (click)=\"filterSelected.emit(filter.value)\"\n    >\n      <div class=\"column label-column\" trans>{{ filter.value.label }}</div>\n      <div class=\"column\" trans>{{ filter.value.description }}</div>\n    </div>\n  </div>\n</div>\n\n<div class=\"help-container\">\n  <mat-icon svgIcon=\"info\"></mat-icon>\n  <div trans>\n    Use arrows, tab or mouse to navigate added filters. Backspace or delete key to remove them.\n  </div>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Input,\n    Output,\n    QueryList,\n    ViewChildren,\n} from '@angular/core';\nimport {DatatableFilter} from '../filter-config/datatable-filter';\n\nconst ITEM_CLASS = 'filter-suggestion-item';\n\n@Component({\n    selector: 'filter-suggestions',\n    templateUrl: './filter-suggestions.component.html',\n    styleUrls: ['./filter-suggestions.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSuggestionsComponent {\n    @Input() filters: {[key: string]: DatatableFilter};\n    @Output() filterSelected = new EventEmitter<DatatableFilter>();\n    @ViewChildren('filterSuggestion') items: QueryList<ElementRef<HTMLElement>>;\n\n    anyFocused(): boolean {\n        return document.activeElement.classList.contains(ITEM_CLASS);\n    }\n\n    focusItemAt(index: number) {\n        this.items.get(index).nativeElement.focus();\n    }\n\n    getFocusedFilter(): DatatableFilter {\n        if (this.anyFocused()) {\n            const k = (document.activeElement as HTMLElement).dataset.filterKey;\n            return this.filters[k];\n        }\n    }\n\n    getFocusedIndex(): number {\n        if (this.anyFocused()) {\n            const el = document.activeElement as HTMLElement;\n            return parseInt(el.dataset.index);\n        }\n    }\n\n    originalOrder = (): number => {\n        return 0;\n    };\n}\n","<ng-container *ngIf=\"value$ | async as value; else defaultHint\">\n    <img class=\"image\" [src]=\"value.image\" />\n    <div class=\"name\">{{ value.name }}</div>\n</ng-container>\n<ng-template #defaultHint>\n    <div trans>Click to select</div>\n</ng-template>\n","import {ChangeDetectionStrategy, Component, HostListener, Input} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {NormalizedModel} from '@common/core/types/models/normalized-model';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {DatatableFilter} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\n\ntype propagateFn = (value: NormalizedModel) => void;\n\n@Component({\n    selector: 'select-model-control',\n    templateUrl: './select-model-control.component.html',\n    styleUrls: ['./select-model-control.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: SelectModelControlComponent,\n            multi: true,\n        },\n    ],\n})\nexport class SelectModelControlComponent implements ControlValueAccessor {\n    @Input() filter: DatatableFilter;\n    private propagateChange: propagateFn;\n    value$ = new BehaviorSubject<NormalizedModel>(null);\n\n    constructor(private dialog: Modal) {}\n\n    registerOnChange(fn: propagateFn): void {\n        this.propagateChange = fn;\n    }\n\n    registerOnTouched(fn: any): void {}\n\n    writeValue(value: NormalizedModel) {\n        this.value$.next(value);\n    }\n\n    @HostListener('click')\n    onClick() {\n        this.openSelectModelDialog();\n    }\n\n    openSelectModelDialog() {\n        this.dialog\n            .open(this.filter.component, this.filter.componentData)\n            .afterClosed()\n            .subscribe((model: NormalizedModel) => {\n                if (model) {\n                    this.value$.next(model);\n                    this.propagateChange(model);\n                }\n            });\n    }\n}\n","import { FilterOperator } from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\n\nexport const FILTER_OPERATOR_NAMES: {[op in FilterOperator]: string} = {\n  '=': 'is',\n  '!=': 'is not',\n  '>': 'is greater than',\n  '>=': 'is greater than or equal to',\n  '<': 'is less than',\n  '<=': 'is less than or equal to',\n  has: 'Include',\n  doesntHave: 'Do not include',\n};\n\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {FilterOperator} from '../../filter-config/datatable-filter';\nimport {FILTER_OPERATOR_NAMES} from '../../../filter-operator-names';\nimport {BreakpointsService} from '../../../../../core/ui/breakpoints.service';\n\n@Pipe({\n    name: 'operatorDisplayName',\n})\nexport class OperatorDisplayNamePipe implements PipeTransform {\n    constructor(private breakpoints: BreakpointsService) {}\n    transform(value: FilterOperator, compact: boolean): string {\n        return compact || this.breakpoints.isMobile$.value\n            ? value\n            : FILTER_OPERATOR_NAMES[value];\n    }\n}\n","<ng-container [formGroup]=\"formGroup\">\n    <select\n        class=\"operator-select\"\n        formControlName=\"operator\"\n        #select\n        (ngModelChange)=\"resizeSelect()\"\n    >\n        <option [value]=\"operator\" *ngFor=\"let operator of operators\">\n            {{ operator | operatorDisplayName:compact }}\n        </option>\n    </select>\n</ng-container>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    Input,\n    ViewChild,\n} from '@angular/core';\nimport {FormGroup} from '@angular/forms';\nimport {FilterOperator} from '../../filter-config/datatable-filter';\n\n@Component({\n    selector: 'operator-select',\n    templateUrl: './operator-select.component.html',\n    styleUrls: ['./operator-select.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OperatorSelectComponent implements AfterViewInit {\n    @Input() compact: boolean;\n    @Input() formGroup: FormGroup;\n    @Input() operators: FilterOperator[];\n    @ViewChild('select') select: ElementRef<HTMLSelectElement>;\n\n    ngAfterViewInit() {\n        this.resizeSelect();\n    }\n\n    resizeSelect() {\n        const select = this.select?.nativeElement;\n        if (select && select.selectedIndex > -1) {\n            const valueLength =\n                select.options[select.selectedIndex].label.length;\n            select.style.width = `${valueLength + 5}ch`;\n        }\n    }\n}\n","<ng-container [formGroup]=\"formGroup\" *ngIf=\"form.controls[key] as formGroup\">\n  <div class=\"filter-label\" (click)=\"el.nativeElement.focus()\" trans>{{ filter.label }}</div>\n  <operator-select\n    *ngIf=\"filter.operators\"\n    [compact]=\"compact\"\n    [formGroup]=\"formGroup\"\n    [operators]=\"filter.operators\"\n  ></operator-select>\n  <ng-container [ngSwitch]=\"filter.type\">\n    <div class=\"filter-input-container\" *ngSwitchCase=\"'select'\">\n      <select\n        [id]=\"key\"\n        #valueInput\n        class=\"filter-input filter-value\"\n        formControlName=\"value\"\n        (ngModelChange)=\"resizeInput()\"\n        [compareWith]=\"compareFilterValueFn\"\n      >\n        <option *ngFor=\"let option of filter.options\" [ngValue]=\"option.value\" trans>\n          {{ option.key || option.value }}\n        </option>\n      </select>\n      <svg viewBox=\"0 0 24 24\" class=\"caret-svg\">\n        <path d=\"M7 10l5 5 5-5z\"></path>\n        <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n      </svg>\n    </div>\n    <div class=\"date-picker-container\" *ngSwitchCase=\"'datePicker'\">\n      <input\n        type=\"date\"\n        class=\"date-input filter-value\"\n        #valueInput\n        [id]=\"key\"\n        formControlName=\"value\"\n      />\n    </div>\n    <select-model-control\n      [filter]=\"filter\"\n      *ngSwitchCase=\"'selectModel'\"\n      #valueInput\n      [id]=\"key\"\n      formControlName=\"value\"\n      class=\"filter-value select-model-input\"\n    ></select-model-control>\n    <div class=\"filter-input-container\" *ngSwitchCase=\"'input'\">\n      <input\n        #valueInput\n        [id]=\"key\"\n        formControlName=\"value\"\n        (ngModelChange)=\"resizeInput()\"\n        [type]=\"filter.inputType || 'text'\"\n        class=\"filter-input filter-value\"\n        min=\"1\"\n        required\n      />\n    </div>\n  </ng-container>\n</ng-container>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    HostBinding,\n    Input,\n    ViewChild,\n} from '@angular/core';\nimport {FormGroup} from '@angular/forms';\nimport {\n    DatatableFilter,\n    FilterValue,\n} from '../../filter-config/datatable-filter';\nimport * as deepequal from 'fast-deep-equal';\nimport {SelectModelControlComponent} from '../select-model-control/select-model-control.component';\n\n@Component({\n    selector: 'active-filter',\n    templateUrl: './active-filter.component.html',\n    styleUrls: ['./active-filter.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        tabIndex: '0',\n        role: 'button',\n    },\n})\nexport class ActiveFilterComponent implements AfterViewInit {\n    @HostBinding('attr.data-control-key') @Input() key: string;\n    @Input() compact: boolean;\n    @Input() form: FormGroup;\n    @Input() filter: DatatableFilter;\n    @ViewChild('valueInput') valueInput:\n        | SelectModelControlComponent\n        | ElementRef<HTMLSelectElement | HTMLInputElement>;\n\n    constructor(public el: ElementRef<HTMLElement>) {}\n\n    ngAfterViewInit() {\n        this.resizeInput();\n    }\n\n    focus() {\n        this.el.nativeElement.focus();\n    }\n\n    focusValueInput() {\n        if (this.valueInput instanceof SelectModelControlComponent) {\n            this.valueInput.openSelectModelDialog();\n        } else if (this.valueInput?.nativeElement) {\n            this.valueInput.nativeElement.focus();\n        }\n    }\n\n    resizeInput() {\n        const el = (this.valueInput as ElementRef)?.nativeElement;\n        if (el?.nodeName === 'SELECT') {\n            const select = el as HTMLSelectElement;\n            if (select.selectedIndex > -1) {\n                const valueLength =\n                    select.options[select.selectedIndex].label.length;\n                select.style.width = `${valueLength + 5}ch`;\n            }\n        } else if (el?.nodeName === 'INPUT' && el.type !== 'date') {\n            const input = el as HTMLInputElement;\n            input.style.width = `${input.value.length + 7}ch`;\n        }\n    }\n\n    compareFilterValueFn = (val1: FilterValue, val2: FilterValue) => {\n        return deepequal(val1, val2);\n    };\n}\n","<ng-container *ngFor=\"let control of form.controls | keyvalue; index as index\">\n    <active-filter\n        [compact]=\"compact\"\n        [key]=\"control.key\"\n        [form]=\"form\"\n        [filter]=\"filter\"\n        *ngIf=\"config[control.value.value.key] as filter\"\n        [attr.data-index]=\"index\"\n    ></active-filter>\n</ng-container>\n<ng-content></ng-content>\n","import {\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    Input,\n    QueryList,\n    ViewChildren,\n} from '@angular/core';\nimport {FormBuilder, FormGroup} from '@angular/forms';\nimport {DatatableFilter} from '../filter-config/datatable-filter';\nimport {randomString} from '@common/core/utils/random-string';\nimport {ActiveFilterComponent} from './active-filter/active-filter.component';\n\ninterface AddFilterOptions {\n    value?: any;\n    operator?: string;\n    focus?: boolean;\n}\n\n@Component({\n    selector: 'active-filters',\n    templateUrl: './active-filters.component.html',\n    styleUrls: ['./active-filters.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActiveFiltersComponent {\n    @Input() compact: boolean;\n    @Input() form: FormGroup;\n    @Input() config: DatatableFilter;\n    @ViewChildren(ActiveFilterComponent)\n    filters: QueryList<ActiveFilterComponent>;\n\n    constructor(\n        private fb: FormBuilder,\n        private cd: ChangeDetectorRef,\n        public el: ElementRef<HTMLElement>\n    ) {}\n\n    add(config: DatatableFilter, opts: AddFilterOptions = {}) {\n        const value =\n            opts.value !== undefined ? opts.value : config.defaultValue;\n        const control = this.fb.group({\n            key: config.key,\n            value,\n            operator: opts.operator || config.defaultOperator,\n        });\n        const key = Object.keys(this.form.controls).length + randomString(8);\n        // don't reload the table if filter does not have any default value (select model/user filter for example)\n        this.form.addControl(key, control, {emitEvent: value !== ''});\n        this.cd.detectChanges();\n        if (opts.focus) {\n            this.filters.last.focusValueInput();\n        }\n    }\n\n    removeByKey(key: string) {\n        this.form.removeControl(key);\n        this.cd.markForCheck();\n    }\n\n    removeCurrentlyFocused() {\n        const activeEl = document.activeElement as HTMLElement;\n        this.removeByKey(activeEl.dataset.controlKey);\n    }\n\n    anyFocused(): boolean {\n        return document.activeElement.nodeName === 'ACTIVE-FILTER';\n    }\n\n    focusLast() {\n        if (this.filters.last) {\n            this.filters.last.focus();\n        }\n    }\n\n    focusPrevious() {\n        const i = this.getFocusedIndex();\n        const previous = this.filters.get(i - 1);\n        if (previous) {\n            previous.focus();\n        }\n    }\n\n    getByIndex(index: number) {\n        return this.filters.get(index);\n    }\n\n    lastIsFocused() {\n        const i = this.getFocusedIndex();\n        return i === this.filters.length - 1;\n    }\n\n    getFocusedIndex(): number {\n        const i = (document.activeElement as HTMLElement).dataset.index;\n        return i ? parseInt(i) : null;\n    }\n}\n","export enum Keycodes {\n    ENTER = 13,\n    SPACE = 32,\n    ESCAPE = 27,\n    DELETE = 46,\n    ARROW_UP = 38,\n    ARROW_RIGHT = 39,\n    ARROW_DOWN = 40,\n    ARROW_LEFT = 37,\n    BACKSPACE = 8,\n    TAB = 9,\n    S = 83,\n    N = 78,\n    A = 65,\n    T = 84,\n    B = 66,\n    C = 67,\n    O = 79,\n    P = 80,\n    R = 82,\n    F = 70,\n    Y = 89,\n    Z = 90,\n}\n","import {Injectable} from '@angular/core';\nimport {Keycodes} from './keycodes.enum';\nimport {fromEvent, Subscription} from 'rxjs';\n\ninterface ParsedKeybind {\n    ctrl: boolean;\n    shift: boolean;\n    key: string;\n}\n\n// TODO: refactor so keybinds are stored for a specific \"listenOn\" element instead of globally\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class Keybinds {\n    private bindings = [];\n\n    public add(keybinds: string|string[], callback: (e: KeyboardEvent) => void) {\n        if ( ! Array.isArray(keybinds)) {\n            keybinds = [keybinds];\n        }\n        keybinds.forEach(keybind => {\n            this.bindings.push({keybind: this.parseKeybindString(keybind), keybindString: keybind, callback});\n        });\n    }\n\n    public addWithPreventDefault(keybind: string, callback: Function) {\n        this.bindings.push({keybind: this.parseKeybindString(keybind), keybindString: keybind, callback, preventDefault: true});\n    }\n\n    public listenOn(el: HTMLElement|Document, options: {fireIfInputFocused?: boolean} = {}): Subscription {\n        return fromEvent(el, 'keydown').subscribe((e: KeyboardEvent) => {\n            if (options.fireIfInputFocused || !['input', 'select'].includes(document.activeElement.nodeName.toLowerCase())) {\n                this.executeBindings(e);\n            }\n        });\n    }\n\n    private executeBindings(e: KeyboardEvent) {\n        this.bindings.forEach(binding => {\n            if ( ! this.bindingMatches(binding.keybind, e)) return;\n            if (binding.preventDefault && e.preventDefault) e.preventDefault();\n            binding.callback(e);\n        });\n    }\n\n    private bindingMatches(keybind: ParsedKeybind, e: KeyboardEvent) {\n        return Keycodes[keybind.key.toUpperCase()] === e.keyCode &&\n          (e.ctrlKey === keybind.ctrl || e.metaKey === keybind.ctrl) &&\n          e.shiftKey === keybind.shift;\n    }\n\n    /**\n     * Parse keybind string into object.\n     */\n    private parseKeybindString(keybind: string): ParsedKeybind {\n        const parts = keybind.trim().split('+');\n        const parsed = {ctrl: false, shift: false, key: ''};\n\n        parts.forEach(part => {\n            part = part.trim().toLowerCase();\n\n            if (part === 'ctrl') {\n                parsed.ctrl = true;\n            } else if (part === 'shift') {\n                parsed.shift = true;\n            } else {\n                parsed.key = part;\n            }\n        });\n\n        return parsed;\n    }\n}\n","<active-filters [form]=\"form\" [config]=\"keyedFilters\" [compact]=\"compact\">\n    <div class=\"input-container search-input-container\">\n        <mat-icon class=\"search-icon\" svgIcon=\"search\"></mat-icon>\n        <input\n            type=\"text\"\n            class=\"search-input\"\n            #searchInput\n            [placeholder]=\"('Type to search for ' + pluralName) | trans\"\n            [formControl]=\"searchControl\"\n            (focus)=\"inputFocus.emit()\"\n        />\n    </div>\n</active-filters>\n\n<button type=\"button\" class=\"clear-button\" (click)=\"clearSearch()\" *ngIf=\"haveFiltersOrQuery$ | async\" mat-icon-button>\n    <mat-icon svgIcon=\"close\"></mat-icon>\n</button>\n\n<button\n    type=\"button\"\n    mat-button\n    class=\"filter-button\"\n    (click)=\"toggleFilterDropdown()\"\n    *ngIf=\"keyedFilters\"\n>\n    <mat-icon class=\"filter-button-icon\" svgIcon=\"filter-list\"></mat-icon>\n    <span class=\"filter-button-text\" *ngIf=\"!compact\" trans>Filter</span>\n</button>\n\n<filter-suggestions\n    [filters]=\"keyedFilters\"\n    (filterSelected)=\"addFilterFromDropdownClick($event)\"\n    [style.top]=\"filterBarHeight + 5 + 'px'\"\n    [class.visible]=\"filterDropdownVisible$ | async\"\n></filter-suggestions>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    EventEmitter,\n    HostListener,\n    Input,\n    OnDestroy,\n    OnInit,\n    Output,\n    QueryList,\n    ViewChild,\n    ViewChildren,\n} from '@angular/core';\nimport {FormBuilder, FormControl} from '@angular/forms';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {distinctUntilChanged, filter, map, startWith} from 'rxjs/operators';\nimport {\n    BehaviorSubject,\n    combineLatest,\n    fromEvent,\n    merge,\n    Observable,\n    Subscription,\n} from 'rxjs';\nimport {\n    DatatableFilter,\n    FilterValue,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {Keybinds} from '@common/core/keybinds/keybinds.service';\nimport {FilterSuggestionsComponent} from './filter-suggestions/filter-suggestions.component';\nimport {ActiveFiltersComponent} from './active-filters/active-filters.component';\n\ninterface FormData {\n    [key: string]: {\n        key: string;\n        value: {value: FilterValue; operator: string} | FilterValue;\n        operator: string;\n    };\n}\n\n@Component({\n    selector: 'search-input-with-filters',\n    templateUrl: './search-input-with-filters.component.html',\n    styleUrls: ['./search-input-with-filters.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SearchInputWithFiltersComponent implements OnInit, AfterViewInit, OnDestroy {\n    @Input() compact: boolean;\n    @Input() searchControl: FormControl;\n    @Input() pluralName: string;\n    @Input() set filters(filters: DatatableFilter[]) {\n        if (filters) {\n            this.keyedFilters = {};\n            (filters || []).forEach(filter => {\n                this.keyedFilters[filter.key] = filter;\n            });\n        } else {\n            this.keyedFilters = null;\n        }\n    }\n\n    @Output() filterChange = new EventEmitter<string>();\n    @Output() inputFocus = new EventEmitter();\n\n    @ViewChild('searchInput') searchInput: ElementRef<HTMLInputElement>;\n    @ViewChild(FilterSuggestionsComponent) suggestions: FilterSuggestionsComponent;\n    @ViewChild(ActiveFiltersComponent) activeFilters: ActiveFiltersComponent;\n    @ViewChildren('filterSuggestion') filterContainers: QueryList<\n        ElementRef<HTMLElement>\n    >;\n\n    keyedFilters: {[key: string]: DatatableFilter};\n\n    form = this.fb.group({});\n\n    filterBarHeight = 0;\n    filterDropdownVisible$ = new BehaviorSubject<boolean>(false);\n    private closeActionsStream$: Subscription;\n\n    haveFiltersOrQuery$: Observable<boolean>;\n\n    constructor(\n        private fb: FormBuilder,\n        private route: ActivatedRoute,\n        private el: ElementRef<HTMLElement>,\n        private keybinds: Keybinds,\n        private cd: ChangeDetectorRef,\n        private router: Router\n    ) {}\n\n    ngOnInit() {\n        this.haveFiltersOrQuery$ = combineLatest([\n            this.searchControl.valueChanges.pipe(startWith(null)),\n            this.form.valueChanges.pipe(startWith(null)),\n        ]).pipe(map(([s, f]) => s || (f && Object.keys(f).length !== 0)));\n    }\n\n    ngAfterViewInit() {\n        this.watchForSizeChanges();\n        this.setFiltersFromQuery();\n        this.setupKeybinds();\n        this.subscribeToCloseActions();\n        this.bindToFormValueChange();\n    }\n\n    @HostListener('click', ['$event'])\n    onClick(e: MouseEvent) {\n        if (\n            e.target === this.el.nativeElement ||\n            e.target === this.activeFilters.el.nativeElement\n        ) {\n            this.searchInput.nativeElement.focus();\n        }\n    }\n\n    ngOnDestroy() {\n        this.closeActionsStream$?.unsubscribe();\n    }\n\n    clearSearch() {\n        Object.keys(this.form.controls).forEach(key => {\n            this.activeFilters.removeByKey(key);\n        });\n        // prevent double datatable reload\n        this.searchControl.reset(null, {emitEvent: false});\n        this.form.reset();\n    }\n\n    toggleFilterDropdown() {\n        if (this.filterDropdownVisible$.value) {\n            this.filterDropdownVisible$.next(false);\n        } else {\n            this.filterDropdownVisible$.next(true);\n        }\n    }\n\n    addFilterFromDropdownClick(config: DatatableFilter) {\n        this.activeFilters.add(config, {focus: true});\n        this.filterDropdownVisible$.next(false);\n    }\n\n    private searchInputIsFocused(): boolean {\n        return document.activeElement === this.searchInput.nativeElement;\n    }\n\n    private cursorAtStartOfSearchInput(): boolean {\n        return (\n            this.searchInputIsFocused() &&\n            this.searchInput.nativeElement.selectionStart === 0\n        );\n    }\n\n    private cursorAtEndOfSearchInput(): boolean {\n        return (\n            this.searchInputIsFocused() &&\n            this.searchInput.nativeElement.selectionStart ===\n                this.searchInput.nativeElement.value.length\n        );\n    }\n\n    private bindToFormValueChange() {\n        this.form.valueChanges\n            .pipe(\n                map(v => (Object.keys(v).length ? v : null)),\n                distinctUntilChanged()\n            )\n            .subscribe((formData: FormData) => {\n                this.filterChange.emit(formData ? encodeFilterFormData(formData) : null);\n            });\n    }\n\n    private watchForSizeChanges() {\n        const resizeObserver = new ResizeObserver(entries => {\n            this.filterBarHeight = entries[0].contentRect.height;\n        });\n        resizeObserver.observe(this.el.nativeElement, {box: 'border-box'});\n    }\n\n    private setFiltersFromQuery() {\n        const qp = this.router.routerState.root.snapshot.queryParams;\n        if (qp.filters) {\n            const filterValues = decodeFilterString(qp.filters);\n            filterValues.forEach(filterValue => {\n                this.activeFilters.add(this.keyedFilters[filterValue.key], filterValue);\n            });\n        }\n        if (qp.query) {\n            this.searchControl.setValue(qp.query);\n        }\n    }\n\n    private setupKeybinds() {\n        this.keybinds.add(['backspace', 'delete'], () => {\n            if (this.cursorAtStartOfSearchInput()) {\n                return this.activeFilters.focusLast();\n            }\n            if (this.activeFilters.anyFocused()) {\n                this.activeFilters.removeCurrentlyFocused();\n                return this.searchInput.nativeElement.focus();\n            }\n        });\n\n        this.keybinds.add('arrow_left', e => {\n            if (this.cursorAtStartOfSearchInput()) {\n                this.activeFilters.focusLast();\n                e.preventDefault();\n            } else if (this.activeFilters.anyFocused()) {\n                this.activeFilters.focusPrevious();\n                e.preventDefault();\n            }\n        });\n\n        this.keybinds.add('arrow_right', e => {\n            if (this.activeFilters.anyFocused()) {\n                e.preventDefault();\n                const i = this.activeFilters.getFocusedIndex();\n                const next = this.activeFilters.getByIndex(i + 1);\n                if (next) {\n                    next.focus();\n                } else if (this.activeFilters.lastIsFocused()) {\n                    this.searchInput.nativeElement.focus();\n                }\n            }\n        });\n\n        this.keybinds.add(['arrow_down', 'tab'], e => {\n            if (this.cursorAtEndOfSearchInput() || this.suggestions.anyFocused()) {\n                e.preventDefault();\n                if (!this.filterDropdownVisible$.value) {\n                    this.toggleFilterDropdown();\n                }\n                const currentIndex = this.suggestions.getFocusedIndex();\n                let newIndex = currentIndex > -1 ? currentIndex : 0;\n                if (this.suggestions.anyFocused()) {\n                    newIndex += 1;\n                }\n                if (newIndex >= this.suggestions.items.length) {\n                    newIndex = 0;\n                }\n                this.suggestions.focusItemAt(newIndex);\n            }\n        });\n\n        this.keybinds.add(['arrow_up', 'shift+tab'], e => {\n            if (this.suggestions.anyFocused()) {\n                e.preventDefault();\n                const currentIndex = this.activeFilters.getFocusedIndex();\n                let newIndex = currentIndex > -1 ? currentIndex : 0;\n                newIndex -= 1;\n                if (newIndex === -1) {\n                    this.searchInput.nativeElement.focus();\n                } else {\n                    this.suggestions.focusItemAt(newIndex);\n                }\n            }\n        });\n\n        this.keybinds.add('enter', e => {\n            const focused = this.suggestions.getFocusedFilter();\n            if (focused) {\n                e.preventDefault();\n                this.activeFilters.add(focused, {focus: true});\n                this.filterDropdownVisible$.next(false);\n            }\n        });\n\n        this.keybinds.add('esc', e => {\n            if (this.filterDropdownVisible$.value) {\n                e.preventDefault();\n                this.filterDropdownVisible$.next(false);\n            }\n        });\n\n        this.keybinds.listenOn(document, {\n            fireIfInputFocused: true,\n        });\n    }\n\n    private subscribeToCloseActions() {\n        this.closeActionsStream$ = merge(\n            fromEvent(document, 'click') as Observable<MouseEvent>,\n            fromEvent(document, 'auxclick') as Observable<MouseEvent>,\n            fromEvent(document, 'touchend') as Observable<TouchEvent>\n        )\n            .pipe(\n                filter(event => {\n                    const clickTarget = event.target as HTMLElement;\n                    return (\n                        clickTarget !== this.el.nativeElement &&\n                        !this.el.nativeElement.contains(clickTarget)\n                    );\n                })\n            )\n            .subscribe(() => {\n                this.filterDropdownVisible$.next(false);\n            });\n    }\n}\n\nconst encodeFilterFormData = (formData: FormData): string => {\n    const filters = [];\n    Object.values(formData).forEach(filter => {\n        if (filter.value !== '') {\n            filters.push(filter);\n        }\n    });\n    if (!filters.length) {\n        return '';\n    }\n    return encodeURIComponent(btoa(JSON.stringify(filters)));\n};\n\nconst decodeFilterString = (filterString: string): DecodedValue[] => {\n    let filtersFromQuery = [];\n    try {\n        filtersFromQuery = JSON.parse(atob(decodeURIComponent(filterString)));\n    } catch (e) {\n        //\n    }\n    return filtersFromQuery;\n};\n\ninterface DecodedValue {\n    key: string;\n    value: {value: FilterValue; operator: string};\n    operator: string;\n}\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {Model} from '@common/core/types/models/model';\nimport {DatatableFilter} from './search-input-with-filters/filter-config/datatable-filter';\n\n@Component({\n    selector: 'datatable-filters',\n    templateUrl: './datatable-filters.component.html',\n    styleUrls: ['./datatable-filters.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DatatableFiltersComponent {\n    @Input() pluralName: string;\n    @Input() filters: DatatableFilter[];\n\n    constructor(public datable: DatatableService<Model>) {}\n\n    onFilterChange(filters: string) {\n        this.datable.filters$.next({\n            filters,\n        });\n    }\n}\n","<search-input-with-filters\n    [searchControl]=\"datable.searchControl\"\n    [pluralName]=\"pluralName\"\n    [filters]=\"filters\"\n    (filterChange)=\"onFilterChange($event)\"\n></search-input-with-filters>\n","import {ComponentType} from '@angular/cdk/portal';\nimport {NormalizedModel} from '@common/core/types/models/normalized-model';\n\nexport class DatatableFilter {\n    defaultValue: FilterValue | '';\n    defaultOperator: FilterOperator;\n    key: string;\n    label: string;\n    description: string;\n    required: boolean;\n    order: number;\n    type: FilterControlType;\n    inputType: 'string' | 'number';\n    options: {key?: string; value: string | boolean | object | number}[];\n    operators: FilterOperator[] | undefined;\n    component?: ComponentType<any>;\n    componentData?: any;\n\n    constructor(options: DatatableFilterOptions) {\n        this.defaultValue =\n            options.defaultValue !== undefined ? options.defaultValue : '';\n        this.key = options.key || '';\n        this.label = options.label || options.key || '';\n        this.description = options.description || '';\n        this.defaultOperator = options.defaultOperator || FilterOperator.eq;\n        this.required = !!options.required;\n        this.order = options.order === undefined ? 1 : options.order;\n        this.type = options.type || FilterControlType.Select;\n        this.inputType = options.inputType;\n        this.options = options.options || [];\n        this.operators = options.operators;\n        this.component = options.component;\n        this.componentData = options.componentData;\n    }\n}\n\nexport interface DatatableFilterOptions {\n    defaultValue?: FilterValue | '';\n    key?: string;\n    label?: string;\n    description: string;\n    component?: ComponentType<any>;\n    componentData?: any;\n    defaultOperator?: FilterOperator;\n    required?: boolean;\n    order?: number;\n    type?: FilterControlType;\n    inputType?: 'string' | 'number';\n    options?: {key?: string; value: string | boolean | object | number}[];\n    operators?: FilterOperator[];\n}\n\nexport enum FilterControlType {\n    Select = 'select',\n    DatePicker = 'datePicker',\n    SelectModel = 'selectModel',\n    Input = 'input',\n    StaticValue = 'staticValue',\n}\n\nexport enum FilterOperator {\n    eq = '=',\n    ne = '!=',\n    gt = '>',\n    gte = '>=',\n    lt = '<',\n    lte = '<=',\n    has = 'has',\n    doesntHave = 'doesntHave',\n}\n\nexport type FilterValueWithOperator = {\n    value: FilterValue;\n    operator: FilterOperator;\n};\nexport const ALL_PRIMITIVE_OPERATORS = [\n    FilterOperator.eq,\n    FilterOperator.ne,\n    FilterOperator.gt,\n    FilterOperator.gte,\n    FilterOperator.lt,\n    FilterOperator.lte,\n];\n\nexport type FilterValue =\n    | string\n    | number\n    | boolean\n    | NormalizedModel\n    | FilterValueWithOperator\n    | null;\n","import {\n    ALL_PRIMITIVE_OPERATORS,\n    DatatableFilter,\n    FilterControlType,\n    FilterOperator,\n} from './datatable-filter';\n\nexport class TimestampFilter extends DatatableFilter {\n    type = FilterControlType.DatePicker;\n    operators = ALL_PRIMITIVE_OPERATORS;\n    defaultOperator = FilterOperator.lte;\n    defaultValue = new Date().toISOString().split('T')[0];\n}\n\nexport class CreatedAtFilter extends TimestampFilter {\n  key = 'created_at';\n  label = 'Created At';\n}\n\nexport class UpdatedAtFilter extends TimestampFilter {\n  key = 'updated_at';\n  label = 'Updated At';\n}\n\n\n","<div class=\"page-size\" *ngIf=\"!hidePerPage\">\n    <div class=\"page-size-label\" trans>Items per page</div>\n    <div class=\"input-container\">\n        <select class=\"page-size-input\" [formControl]=\"perPageControl\">\n            <option [ngValue]=\"10\">10</option>\n            <option [ngValue]=\"15\">15</option>\n            <option [ngValue]=\"20\">20</option>\n            <option [ngValue]=\"50\">50</option>\n            <option [ngValue]=\"100\">100</option>\n        </select>\n    </div>\n</div>\n<div class=\"range-actions\">\n    <div class=\"range-label\" *ngIf=\"from && to && totalRecords\">\n        {{from}} - {{to}} {{'of' | trans}} {{totalRecords | number}}\n    </div>\n    <button type=\"button\" [disabled]=\"!havePrevious || (datable.paginator.loading$ | async)\" class=\"range-button\" (click)=\"previousPage()\" mat-icon-button>\n        <mat-icon svgIcon=\"chevron-left\"></mat-icon>\n    </button>\n    <button type=\"button\" [disabled]=\"!haveNext || (datable.paginator.loading$ | async)\" class=\"range-button\" (click)=\"nextPage()\" mat-icon-button>\n        <mat-icon svgIcon=\"chevron-right\"></mat-icon>\n    </button>\n</div>\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {DatatableService} from '../datatable.service';\nimport {Subscription} from 'rxjs';\nimport {filter, map} from 'rxjs/operators';\n\n@Component({\n    selector: 'datatable-footer',\n    templateUrl: './datatable-footer.component.html',\n    styleUrls: ['./datatable-footer.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DatatableFooterComponent implements OnInit, OnDestroy {\n    @Input() hidePerPage = false;\n    public perPageControl = new FormControl(15);\n    public from: number;\n    public to: number;\n    public totalRecords: number;\n    public havePrevious: boolean;\n    public haveNext: boolean;\n    private changeRef: Subscription;\n\n    constructor(\n        public datable: DatatableService<any>,\n        private cd: ChangeDetectorRef,\n    ) {}\n\n    ngOnInit() {\n        this.changeRef = this.datable.paginator.response$\n            .pipe(filter(r => !!r?.pagination), map(r => r.pagination))\n            .subscribe(pagination => {\n                this.totalRecords = pagination.total;\n                this.to = Math.min((pagination.per_page * pagination.current_page), this.totalRecords);\n                this.from = Math.max((this.to - pagination.per_page), 1);\n                this.havePrevious = this.datable.paginator.canLoadPrevPage();\n                this.haveNext = this.datable.paginator.canLoadNextPage();\n                this.perPageControl.setValue(parseInt('' + pagination.per_page), {emitEvent: false});\n                this.cd.markForCheck();\n            });\n\n        this.perPageControl.valueChanges\n            .subscribe(perPage => {\n                this.datable.paginator.changePerPage(perPage);\n            });\n    }\n\n    ngOnDestroy() {\n        this.changeRef.unsubscribe();\n        this.datable.destroy();\n    }\n\n    public previousPage() {\n        this.datable.paginator.previousPage();\n    }\n\n    public nextPage() {\n        this.datable.paginator.nextPage();\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SearchInputWithFiltersComponent} from './search-input-with-filters.component';\nimport {ActiveFiltersComponent} from './active-filters/active-filters.component';\nimport {ActiveFilterComponent} from './active-filters/active-filter/active-filter.component';\nimport {OperatorSelectComponent} from './active-filters/operator-select/operator-select.component';\nimport {FilterSuggestionsComponent} from './filter-suggestions/filter-suggestions.component';\nimport {OperatorDisplayNamePipe} from './active-filters/operator-select/operator-display-name.pipe';\nimport {SelectModelControlComponent} from './active-filters/select-model-control/select-model-control.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {SelectModelDialogComponent} from '@common/datatable/datatable-filters/select-model-dialog/select-model-dialog.component';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\n\n@NgModule({\n    declarations: [\n        SearchInputWithFiltersComponent,\n        ActiveFiltersComponent,\n        ActiveFilterComponent,\n        OperatorSelectComponent,\n        FilterSuggestionsComponent,\n        OperatorDisplayNamePipe,\n        SelectModelControlComponent,\n        SelectModelDialogComponent,\n    ],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        ReactiveFormsModule,\n        MatIconModule,\n        MatButtonModule,\n        MatDialogModule,\n        LoadingIndicatorModule,\n    ],\n    exports: [SearchInputWithFiltersComponent],\n})\nexport class SearchInputWithFiltersModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TableSortHeaderComponent} from './table-sort-header/table-sort-header.component';\nimport {MatIconModule} from '@angular/material/icon';\nimport {TranslationsModule} from '../core/translations/translations.module';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {UserColumnComponent} from './columns/user-column/user-column.component';\nimport {TableBodyCheckboxComponent} from './selection/table-body-checkbox.component';\nimport {TableHeaderCheckboxComponent} from './selection/table-header-checkbox.component';\nimport {DatatableFooterComponent} from './datatable-footer/datatable-footer.component';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule} from '@angular/material/button';\nimport {DatatableHeaderComponent} from './datatable-header/datatable-header.component';\nimport {MatChipsModule} from '@angular/material/chips';\nimport {DatatableFiltersPanelComponent} from './datatable-filters-panel/datatable-filters-panel.component';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {ChipsModule} from '../core/ui/chips/chips.module';\nimport {DatatableHeaderSearchInputComponent} from './datatable-header/datatable-header-search-input/datatable-header-search-input.component';\nimport {NoResultsMessageModule} from '../core/ui/no-results-message/no-results-message.module';\nimport {NoResultsMessageComponent} from '../core/ui/no-results-message/no-results-message.component';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {DatatableFiltersComponent} from '@common/datatable/datatable-filters/datatable-filters.component';\nimport {DatatablePageHeaderComponent} from '@common/datatable/datatable-page-header/datatable-page-header.component';\nimport {SearchInputWithFiltersModule} from './datatable-filters/search-input-with-filters/search-input-with-filters.module';\nimport {RouterModule} from '@angular/router';\n\n@NgModule({\n    declarations: [\n        TableSortHeaderComponent,\n        UserColumnComponent,\n        TableBodyCheckboxComponent,\n        TableHeaderCheckboxComponent,\n        DatatableFooterComponent,\n        DatatableHeaderComponent,\n        DatatableHeaderSearchInputComponent,\n        DatatableFiltersPanelComponent,\n        DatatableHeaderSearchInputComponent,\n        DatatableFiltersComponent,\n        DatatablePageHeaderComponent,\n    ],\n    imports: [\n        CommonModule,\n        TranslationsModule,\n        ReactiveFormsModule,\n        FormsModule,\n        ChipsModule,\n        NoResultsMessageModule,\n        FormatPipesModule,\n        SearchInputWithFiltersModule,\n        RouterModule,\n\n        // material\n        MatButtonModule,\n        MatIconModule,\n        MatCheckboxModule,\n        MatChipsModule,\n        MatProgressBarModule,\n    ],\n    exports: [\n        TableSortHeaderComponent,\n        MatCheckboxModule,\n        UserColumnComponent,\n        TableBodyCheckboxComponent,\n        TableHeaderCheckboxComponent,\n        DatatableFooterComponent,\n        DatatableHeaderComponent,\n        DatatableFiltersPanelComponent,\n        DatatableHeaderSearchInputComponent,\n        NoResultsMessageComponent,\n        DatatableFiltersComponent,\n        DatatablePageHeaderComponent,\n    ],\n})\nexport class DatatableModule {}\n","import {Params, Router} from '@angular/router';\nimport {BehaviorSubject, of, Subscription} from 'rxjs';\nimport {map, switchMap, tap} from 'rxjs/operators';\nimport {PaginationResponse} from '@common/core/types/pagination/pagination-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {PaginationParams} from '@common/core/types/pagination/pagination-params';\nimport {Injectable} from '@angular/core';\nimport {LocalStorage} from '@common/core/services/local-storage.service';\n\n@Injectable()\nexport class Paginator<T> {\n    private subscription: Subscription;\n    private params$ = new BehaviorSubject<PaginationParams>({});\n    public paginatedOnce$ = new BehaviorSubject<boolean>(false);\n    public loading$ = new BehaviorSubject(false);\n    public response$ = new BehaviorSubject<{pagination: PaginationResponse<T>, [key: string]: any}>(null);\n    public dontUpdateQueryParams = false;\n    public perPageCacheKey: string = null;\n    /** only true if data was already loaded from backend and it was empty */\n    public noResults$ = this.response$.pipe(map(r => this.paginatedOnce$.value && r.pagination.data.length === 0));\n\n    get params(): PaginationParams {\n        return this.params$.value;\n    }\n\n    get currentPage(): number {\n        return this.response$.value?.pagination?.current_page;\n    }\n\n    constructor(\n        private router: Router,\n        private http: AppHttpClient,\n        private localStorage?: LocalStorage,\n    ) {}\n\n    public paginate(userParams: object = {}, url?: string, initialData?: PaginationResponse<T>) {\n        // only use query params on first pagination, so query params can be removed via user params\n        const queryParams = !this.subscription ? this.currentQueryParams() : {};\n        const paginationParams = this.response$.value ? {\n            perPage: this.response$.value.pagination.per_page,\n            page: this.response$.value.pagination.current_page\n        } : {};\n        this.params$.next({...paginationParams, ...queryParams, ...userParams});\n\n        if ( ! this.subscription) {\n            this.init(url, initialData);\n        }\n    }\n\n    public nextPage() {\n        const current = this.response$.value.pagination.current_page || 0;\n        this.paginate({\n            ...this.params$.value,\n            page: current + 1,\n            cursor: this.response$.value.pagination.next_cursor,\n        });\n    }\n\n    public previousPage() {\n        const current = this.response$.value.pagination.current_page;\n        this.paginate({\n            ...this.params$.value,\n            page: (current - 1) || 1,\n            cursor: this.response$.value.pagination.prev_cursor,\n        });\n    }\n\n    public changePerPage(newPerPage: number) {\n        if (newPerPage !== this.params$.value?.perPage) {\n            if (this.perPageCacheKey) {\n                this.localStorage.set(this.perPageCacheKey, newPerPage);\n            }\n            this.paginate({\n                ...this.params$.value,\n                perPage: newPerPage\n            });\n        }\n    }\n\n    public currentQueryParams(): Params {\n        return this.router.routerState.root.snapshot.queryParams;\n    }\n\n    private init(uri: string, initialData?: PaginationResponse<T>) {\n        this.subscription = this.params$.pipe(\n            switchMap(params => {\n                this.loading$.next(true);\n                const firstPagination = !this.paginatedOnce$.value;\n                if (firstPagination && this.perPageCacheKey && this.localStorage.get(this.perPageCacheKey)) {\n                    params = {perPage: this.localStorage.get(this.perPageCacheKey), ...params};\n                }\n\n                // if we got initial pagination response (of 1st page)\n                // return that instead of making 1st page http request\n                const request = firstPagination && initialData ?\n                    of({pagination: initialData}) :\n                    this.http.get(uri, params);\n\n                return (request as PaginatedBackendResponse<T>).pipe(\n                    // can't use \"finalize\" here as it will complete after loading$.next(true)\n                    // call above, which will prevent loading bar from showing\n                    // if pagination request is cancelled and new one is queued\n                    tap(() => {\n                        this.updateQueryParams(params);\n                        this.loading$.next(false);\n                        this.paginatedOnce$.next(true);\n                    }, () => {\n                        this.loading$.next(false);\n                        this.paginatedOnce$.next(true);\n                    })\n                ) as PaginatedBackendResponse<T>;\n            })\n        ).subscribe(response => {\n            this.response$.next(response);\n        });\n    }\n\n    private updateQueryParams(params = {}) {\n        if (this.dontUpdateQueryParams) return;\n        for (const key in params) {\n            if (Array.isArray(params[key])) {\n                params[key] = params[key].join(',');\n            }\n        }\n        this.router.navigate([], {queryParams: params, replaceUrl: true});\n    }\n\n    public canLoadNextPage(): boolean {\n        const data = this.response$.value?.pagination;\n        if (data) {\n            return !!data.next_cursor || (this.currentPage < data.last_page);\n        }\n        return false;\n    }\n\n    public canLoadPrevPage(): boolean {\n        const data = this.response$.value?.pagination;\n        if (data) {\n            return !!data.prev_cursor || (this.currentPage > 1);\n        }\n        return false;\n    }\n}\n","import * as Dot from \"dot-object\";\nimport {_isNumberValue} from '@angular/cdk/coercion';\nimport {Model} from '@common/core/types/models/model';\n\nconst MAX_SAFE_INTEGER = 9007199254740991;\n\nexport function sortDatatableData<T extends Model>(data: T[], orderBy: string, orderDir: string): T[] {\n    return data.sort((a, b) => {\n        let valueA = sortingDataAccessor(a, orderBy);\n        let valueB = sortingDataAccessor(b, orderBy);\n\n        // If there are data in the column that can be converted to a number,\n        // it must be ensured that the rest of the data\n        // is of the same type so as not to order incorrectly.\n        const valueAType = typeof valueA;\n        const valueBType = typeof valueB;\n\n        if (valueAType !== valueBType) {\n            if (valueAType === 'number') {\n                valueA += '';\n            }\n            if (valueBType === 'number') {\n                valueB += '';\n            }\n        }\n\n        // If both valueA and valueB exist (truthy), then compare the two. Otherwise, check if\n        // one value exists while the other doesn't. In this case, existing value should come last.\n        // This avoids inconsistent results when comparing values to undefined/null.\n        // If neither value exists, return 0 (equal).\n        let comparatorResult = 0;\n        if (valueA != null && valueB != null) {\n            // Check if one value is greater than the other; if equal, comparatorResult should remain 0.\n            if (valueA > valueB) {\n                comparatorResult = 1;\n            } else if (valueA < valueB) {\n                comparatorResult = -1;\n            }\n        } else if (valueA != null) {\n            comparatorResult = 1;\n        } else if (valueB != null) {\n            comparatorResult = -1;\n        }\n\n        return comparatorResult * (orderDir === 'asc' ? 1 : -1);\n    });\n}\n\n/**\n * Data accessor function that is used for accessing data properties for sorting through\n * the default sortData function.\n * This default function assumes that the sort header IDs (which defaults to the column name)\n * matches the data's properties (e.g. column Xyz represents data['Xyz']).\n * May be set to a custom function for different behavior.\n */\nfunction sortingDataAccessor(data: object, sortHeaderId: string): string {\n    const value = Dot.pick(sortHeaderId, data);\n\n    if (_isNumberValue(value)) {\n        const numberValue = Number(value);\n\n        // Numbers beyond `MAX_SAFE_INTEGER` can't be compared reliably so we\n        // leave them as strings. For more info: https://goo.gl/y5vbSg\n        return numberValue < MAX_SAFE_INTEGER ? numberValue : value;\n    }\n\n    // if (Array.isArray(value)) {\n    //     return value.reduce((prev, curr) => prev += objectToStr(curr));\n    // }\n\n    return value;\n}\n","import {Injectable} from '@angular/core';\nimport {\n    animationFrameScheduler,\n    BehaviorSubject,\n    combineLatest,\n    Subscription,\n} from 'rxjs';\nimport {Paginator} from '../shared/paginator.service';\nimport {debounceTime, filter, map, pairwise, tap} from 'rxjs/operators';\nimport {DatatableFilters, DatatableFilterValue} from './types/datatable-filters';\nimport {DatatableSort} from './types/datatable-sort';\nimport {PaginationParams} from '../core/types/pagination/pagination-params';\nimport {removeNullFromObject} from '../core/utils/remove-null-from-object';\nimport {ComponentType} from '@angular/cdk/portal';\nimport {MatDialogConfig} from '@angular/material/dialog';\nimport {Modal} from '../core/ui/dialogs/modal.service';\nimport {ConfirmModalComponent} from '../core/ui/confirm-modal/confirm-modal.component';\nimport {DELETE_RESOURCE_MESSAGE} from './delete-resource-message';\nimport {PaginationResponse} from '../core/types/pagination/pagination-response';\nimport {sortDatatableData} from '@common/datatable/utils/sort-datatable-data';\nimport {Model} from '@common/core/types/models/model';\nimport {filterDatatableData} from '@common/datatable/utils/filter-datatable-data';\nimport {Router} from '@angular/router';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {LocalStorage} from '../core/services/local-storage.service';\nimport {FormControl} from '@angular/forms';\n\nexport type DatatableStaticParams = Record<string, string | number | boolean | string[]>;\n\ninterface DatatableConfig<T> {\n    uri?: string;\n    staticParams?: DatatableStaticParams;\n    initialData?: PaginationResponse<T> | T[];\n    disableSort?: boolean;\n    infiniteScroll?: boolean;\n}\n\n@Injectable()\nexport class DatatableService<T extends Model> {\n    public sort$ = new BehaviorSubject<DatatableSort>({});\n    public filters$ = new BehaviorSubject<DatatableFilters>({});\n    public searchControl = new FormControl();\n    public searchTerm$ = new BehaviorSubject<string>(null);\n    public staticParams$ = new BehaviorSubject<DatatableStaticParams>({});\n    public paginator = new Paginator<T>(this.router, this.http, this.localStorage);\n    private paginatorSub: Subscription;\n    private mainSub: Subscription;\n    private searchControlSub: Subscription;\n    private ignoreNextParamChange = false;\n    private originalData$ = new BehaviorSubject<T[]>([]);\n    public data$ = new BehaviorSubject<T[]>([]);\n    public selectedRows$ = new BehaviorSubject<number[]>([]);\n    public config: DatatableConfig<T>;\n\n    constructor(\n        protected modal: Modal,\n        protected router: Router,\n        protected http: AppHttpClient,\n        protected localStorage: LocalStorage\n    ) {}\n\n    get data() {\n        return this.data$.value;\n    }\n\n    set data(data: T[]) {\n        const tableData = [...data];\n        this.originalData$.next(tableData);\n        this.data$.next(tableData);\n\n        // Reset filters and sort without trigger data reload via pagination\n        this.ignoreNextParamChange = true;\n        this.reset();\n    }\n\n    public init(config: DatatableConfig<T> = {}) {\n        // TODO: don't add static params to current url query params\n\n        this.config = config;\n        this.staticParams$.next({\n            ...this.staticParams$.value,\n            ...config.staticParams,\n        });\n        if (config.uri) {\n            this.connectToPaginator();\n        } else if (config.initialData) {\n            this.data = config.initialData as T[];\n        }\n\n        // set search term from queryParams\n        if (config.uri) {\n            const qp = this.router.routerState.root.snapshot.queryParams;\n            const initialSearchTerm = qp.query as string;\n            this.searchControl.setValue(initialSearchTerm);\n            this.searchTerm$.next(initialSearchTerm);\n            this.sort$.next({\n                orderBy: qp.orderBy,\n                orderDir: qp.orderDir,\n            });\n        }\n        this.searchControlSub = this.searchControl.valueChanges\n            .pipe(debounceTime(300))\n            .subscribe(value => {\n                this.searchTerm$.next(value);\n            });\n\n        this.mainSub = combineLatest([\n            this.sort$,\n            this.filters$,\n            this.searchTerm$.pipe(\n                map(query => {\n                    return {query};\n                })\n            ),\n            // static params needs to be last, so it can override all the other params\n            this.staticParams$,\n        ])\n            .pipe(\n                debounceTime(0, animationFrameScheduler),\n                map(params => Object.assign({}, ...params))\n            )\n            .subscribe((params: PaginationParams) => {\n                if (this.ignoreNextParamChange) {\n                    return (this.ignoreNextParamChange = false);\n                }\n                params = removeNullFromObject(params);\n                Object.entries(params).forEach(([key, value]) => {\n                    if (typeof value === 'object' && value.id) {\n                        params[`${key}Id`] = value.id;\n                        delete params[key];\n                    }\n                });\n                if (this.config.uri) {\n                    this.paginator.paginate(\n                        params,\n                        this.config.uri,\n                        this.config.initialData as PaginationResponse<T>\n                    );\n                } else if (Object.keys(params).length && this.data.length) {\n                    this.applyLocalTransforms(params);\n                }\n            });\n\n        return this;\n    }\n\n    private connectToPaginator() {\n        this.paginatorSub = this.paginator.response$\n            .pipe(pairwise())\n            .subscribe(([prev, current]) => {\n                // append data instead of overriding with next page data (infinite scroll).\n                // if page did not change, we can assume that it was filter or sort\n                // change and we should use only new data, even on infinite scroll\n                const data =\n                    this.config.infiniteScroll &&\n                    prev?.pagination?.current_page !== current.pagination.current_page\n                        ? [...this.data$.value, ...current.pagination.data]\n                        : current.pagination.data;\n                this.data$.next(data);\n            });\n    }\n\n    private applyLocalTransforms(params: PaginationParams) {\n        let data = [...this.originalData$.value];\n        if (params.query) {\n            data = filterDatatableData<T>(data, params.query);\n        }\n        if (params.orderBy && params.orderDir) {\n            data = sortDatatableData<T>(data, params.orderBy, params.orderDir);\n        }\n        this.data$.next(data);\n    }\n\n    public addFilter(key: keyof DatatableFilters, value: DatatableFilterValue) {\n        this.filters$.next({\n            ...this.filters$.value,\n            [key]: value,\n        });\n    }\n\n    public removeFilter(key: keyof DatatableFilters) {\n        const filters = {...this.filters$.value};\n        delete filters[key];\n        this.filters$.next(filters);\n    }\n\n    public reset(staticParams: DatatableStaticParams = null) {\n        this.filters$.next({});\n        this.sort$.next({});\n        this.selectedRows$.next([]);\n        if (staticParams) {\n            this.staticParams$.next(staticParams);\n        }\n    }\n\n    public openCrupdateResourceModal(\n        cmp: ComponentType<any>,\n        data?: object,\n        config?: MatDialogConfig\n    ) {\n        return this.modal\n            .open(cmp, data, config)\n            .beforeClosed()\n            .pipe(\n                filter(modifiedResource => !!modifiedResource),\n                tap(() => this.reset())\n            );\n    }\n\n    public confirmResourceDeletion(resource: string) {\n        const data = {...DELETE_RESOURCE_MESSAGE, replacements: {resource}};\n        return this.modal\n            .open(ConfirmModalComponent, data)\n            .afterClosed()\n            .pipe(filter(confirmed => confirmed));\n    }\n\n    public getCurrentParams() {\n        return {\n            ...this.sort$.value,\n            ...this.filters$.value,\n            ...this.staticParams$.value,\n            ...this.paginator.params,\n        };\n    }\n\n    public destroy() {\n        this.paginatorSub?.unsubscribe();\n        this.mainSub?.unsubscribe();\n        this.searchControlSub?.unsubscribe();\n    }\n}\n","import {ConfirmModalData} from '../core/ui/confirm-modal/confirm-modal.component';\n\nexport const DELETE_RESOURCE_MESSAGE: ConfirmModalData = {\n    title: `Delete :resource`,\n    body:  `Are you sure you want to delete selected :resource?`,\n    ok:    'Delete'\n};\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {DatatableService} from '../datatable.service';\nimport {Subscription} from 'rxjs';\nimport {Model} from '../../core/types/models/model';\n\n@Component({\n    selector: '[table-body-checkbox]',\n    template: `\n        <mat-checkbox (click)=\"$event.stopPropagation()\"\n                      (change)=\"$event ? toggleRow(rowId) : null\"\n                      [checked]=\"isRowSelected(rowId)\">\n        </mat-checkbox>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {'class': 'table-checkbox'}\n})\nexport class TableBodyCheckboxComponent implements OnInit, OnDestroy {\n    @Input('table-body-checkbox') rowId: number;\n    private changeRef: Subscription;\n\n    constructor(\n        public datatable: DatatableService<Model>,\n        private cd: ChangeDetectorRef,\n    ) {}\n\n    ngOnInit() {\n        this.changeRef = this.datatable.selectedRows$.subscribe(value => {\n            this.cd.markForCheck();\n        });\n    }\n\n    ngOnDestroy() {\n        this.changeRef.unsubscribe();\n    }\n\n    public isRowSelected(id: number): boolean {\n        return this.datatable.selectedRows$.value.indexOf(id) > -1;\n    }\n\n    public toggleRow(id: number) {\n        if (this.isRowSelected(id)) {\n            const array = this.datatable.selectedRows$.value.slice();\n            const i = this.datatable.selectedRows$.value.indexOf(id);\n            array.splice(i, 1);\n            this.datatable.selectedRows$.next(array);\n        } else {\n            this.datatable.selectedRows$.next(\n                [...this.datatable.selectedRows$.value, id]\n            );\n        }\n    }\n}\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit} from '@angular/core';\nimport {DatatableService} from '../datatable.service';\nimport {Subscription} from 'rxjs';\nimport {Model} from '../../core/types/models/model';\n\n@Component({\n    selector: '[table-header-checkbox]',\n    template: `\n        <mat-checkbox\n            (change)=\"$event ? toggleAllRows() : null\"\n            [checked]=\"allRowsSelected()\"\n            [indeterminate]=\"anyRowsSelected() && ! allRowsSelected()\">\n        </mat-checkbox>\n    `,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {'class': 'table-checkbox'},\n})\nexport class TableHeaderCheckboxComponent implements OnInit, OnDestroy{\n    private changeRef: Subscription;\n    constructor(\n        public datatable: DatatableService<Model>,\n        private cd: ChangeDetectorRef,\n    ) {}\n\n    ngOnInit() {\n        this.changeRef = this.datatable.selectedRows$.subscribe(() => {\n            this.cd.markForCheck();\n        });\n    }\n\n    ngOnDestroy() {\n        this.changeRef.unsubscribe();\n    }\n\n    public anyRowsSelected(): boolean {\n        return !!this.datatable.selectedRows$.value.length;\n    }\n\n    public allRowsSelected() {\n        return this.datatable.selectedRows$.value.length &&\n            this.datatable.selectedRows$.value.length === this.datatable.data$.value?.length;\n    }\n\n    public toggleAllRows() {\n        if (this.allRowsSelected()) {\n            this.datatable.selectedRows$.next([]);\n        } else {\n            this.datatable.selectedRows$.next(\n                this.datatable.data$.value.map(v => v.id)\n            );\n        }\n    }\n}\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    HostBinding,\n    Input,\n    OnDestroy,\n    OnInit,\n    ViewChild\n} from '@angular/core';\nimport {DatatableService} from '../datatable.service';\nimport {Subscription} from 'rxjs';\nimport {Model} from '../../core/types/models/model';\nimport {FocusMonitor} from '@angular/cdk/a11y';\nimport {filter} from 'rxjs/operators';\nimport {ENTER, SPACE} from '@angular/cdk/keycodes';\nimport {slugifyString} from '../../core/utils/slugify-string';\n\n@Component({\n    selector: '[table-sort-header]',\n    templateUrl: './table-sort-header.component.html',\n    styleUrls: ['./table-sort-header.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        'tabindex': '0',\n        '(click)': 'handleClick()',\n        '(keydown)': 'handleKeydown($event)',\n        '(mouseenter)': 'onMouseEnter()',\n        '(mouseleave)': 'onMouseLeave()',\n    }\n})\nexport class TableSortHeaderComponent implements OnInit, AfterViewInit, OnDestroy {\n    @ViewChild('columnName', {static: true}) columnName: ElementRef<HTMLElement>;\n    @Input('table-sort-header') public orderBy: string;\n\n    @HostBinding('class.active')\n    public orderDir: 'desc'|'asc'|null = null;\n\n    @HostBinding('class.sort-disabled') get sortDisabled() {\n        return this.datable.config?.disableSort;\n    }\n\n    private sortSub: Subscription;\n    public arrowVisible = false;\n    public arrowDirection: 'down'|'up' = 'down';\n\n    constructor(\n        public datable: DatatableService<Model>,\n        private cd: ChangeDetectorRef,\n        private focusMonitor: FocusMonitor,\n        private el: ElementRef<HTMLElement>,\n    ) {}\n\n    ngOnInit() {\n        // get column name from <ng-content> if none is explicitly provided\n        if ( ! this.orderBy) {\n            this.orderBy = slugifyString(this.columnName.nativeElement.textContent, '_');\n        }\n\n        // hide arrow when sort column is changed to different column\n        this.sortSub = this.datable.sort$\n            .pipe(filter(sort => (sort.orderBy !== this.orderBy)))\n            .subscribe(() => {\n                this.orderDir = null;\n                this.onMouseLeave();\n                this.cd.markForCheck();\n            });\n    }\n\n    ngAfterViewInit() {\n        // add '.cdk-keyboard-focused' when tabbing to other sort headers\n        this.focusMonitor.monitor(this.el).subscribe();\n    }\n\n    ngOnDestroy() {\n        this.sortSub.unsubscribe();\n        this.focusMonitor.stopMonitoring(this.el);\n    }\n\n    public changeSort() {\n        this.datable.sort$.next({\n            orderBy: this.orderBy,\n            orderDir: this.getDirection(this.orderDir),\n        });\n    }\n\n    private getDirection(current: string) {\n        switch (current) {\n            case 'asc':\n                this.arrowVisible = false;\n                return this.orderDir = null;\n            case 'desc':\n                this.arrowVisible = true;\n                this.arrowDirection = 'up';\n                return this.orderDir = 'asc';\n            default:\n                this.arrowVisible = true;\n                this.arrowDirection = 'down';\n                return this.orderDir = 'desc';\n        }\n    }\n\n    public onMouseEnter() {\n        if ( ! this.datable.config?.disableSort) {\n            this.arrowVisible = true;\n        }\n    }\n\n    public onMouseLeave() {\n        this.arrowVisible = false;\n        if ( ! this.orderDir) {\n            this.arrowDirection = 'down';\n        }\n    }\n\n    public handleClick() {\n        if ( ! this.datable.config?.disableSort) {\n            this.changeSort();\n        }\n    }\n\n    public handleKeydown(e: KeyboardEvent) {\n        if ( !this.datable.config?.disableSort && (e.keyCode === SPACE || e.keyCode === ENTER)) {\n            e.preventDefault();\n            this.changeSort();\n        }\n    }\n}\n","<span class=\"text\" #columnName>\n    <ng-content></ng-content>\n</span>\n<span class=\"icon-wrapper\" [ngClass]=\"arrowDirection\">\n    <mat-icon svgIcon=\"arrow-downward\" class=\"sort-icon\" [class.hint-visible]=\"arrowVisible\"></mat-icon>\n</span>\n","export function filterDatatableData<T = object>(data: T[], filter: string): T[] {\n    return data.filter(obj => filterPredicate(obj as any, filter));\n}\n/**\n * Checks if a data object matches the data source's filter string. By default, each data object\n * is converted to a string of its properties and returns true if the filter has\n * at least one occurrence in that string. By default, the filter string has its whitespace\n * trimmed and the match is case-insensitive. May be overridden for a custom implementation of\n * filter matching.\n * @param data Data object used to check against the filter.\n * @param filter Filter string that has been set on the data source.\n * @returns Whether the filter matches against the data\n */\nfunction filterPredicate(data: object|string, filter: string): boolean {\n    // Transform the data into a lowercase string of all property values.\n    const dataStr = typeof data === 'string' ? data : objectToStr(data);\n\n    // Transform the filter by converting it to lowercase and removing whitespace.\n    const transformedFilter = filter.trim().toLowerCase();\n\n    return dataStr.indexOf(transformedFilter) !== -1;\n}\n\nexport function objectToStr(obj: object) {\n    return Object.keys(obj).reduce((currentTerm: string, key: string) => {\n        // Use an obscure Unicode character to delimit the words in the concatenated string.\n        // This avoids matches where the values of two columns combined will match the user's query\n        // (e.g. `Flute` and `Stop` will match `Test`). The character is intended to be something\n        // that has a very low chance of being typed in by somebody in a text field. This one in\n        // particular is \"White up-pointing triangle with dot\" from\n        // https://en.wikipedia.org/wiki/List_of_Unicode_characters\n        const term = (obj[key] && typeof obj[key] === 'object') ?\n            objectToStr(obj[key]) :\n            obj[key];\n        return currentTerm + term + '◬';\n    }, '').toLowerCase();\n}\n","import { CanDeactivate } from '@angular/router';\nimport {ComponentCanDeactivate} from '@common/guards/pending-changes/component-can-deactivate';\nimport {Observable} from 'rxjs';\nimport {Injectable} from '@angular/core';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class PendingChangesGuard implements CanDeactivate<ComponentCanDeactivate> {\n    constructor(private modal: Modal) {}\n\n    canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {\n        if (component.canDeactivate()) {\n            return true;\n        } else {\n            return this.modal.show(ConfirmModalComponent, {\n                title: 'Unsaved Changes',\n                body:  'You have unsaved changes. Do you want to discard them?',\n                ok:    'Discard'\n            }).beforeClosed();\n        }\n    }\n}\n","import {Injectable, NgZone} from '@angular/core';\nimport {Settings} from '../../core/config/settings.service';\nimport {LazyLoaderService} from '../../core/utils/lazy-loader.service';\nimport {BreakpointsService} from '../../core/ui/breakpoints.service';\nimport {Editor, EditorManager} from 'tinymce';\nimport {Translations} from '../../core/translations/translations.service';\n\nconst EDITOR_TOOLBAR_HEIGHT = 74;\n\ndeclare const tinymce: EditorManager;\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class TinymceTextEditor {\n    private bootstrapPromise: Promise<Editor> | boolean;\n    private bootstrapPromiseResolve: any;\n    private config: {[key: string]: any};\n    public tinymceInstance: Editor | any;\n\n    constructor(\n        private settings: Settings,\n        private zone: NgZone,\n        private lazyLoader: LazyLoaderService,\n        private breakpoints: BreakpointsService,\n        private i18n: Translations\n    ) {\n        this.makeBootstrapPromise();\n    }\n\n    public reset() {\n        if (!this.editorIsReady()) return;\n        this.tinymceInstance.setContent('');\n        this.tinymceInstance.undoManager.clear();\n    }\n\n    public focus() {\n        this.waitForEditor().then(() => {\n            this.tinymceInstance.focus(false);\n        });\n    }\n\n    public hasUndo(): boolean {\n        return this.editorIsReady() && this.tinymceInstance.undoManager.hasUndo();\n    }\n\n    public hasRedo(): boolean {\n        return this.editorIsReady() && this.tinymceInstance.undoManager.hasRedo();\n    }\n\n    /**\n     * Queries the current state for specified tinymce command.\n     * For example if the current selection is \"bold\".\n     */\n    public queryCommandState(name: string): boolean | number {\n        return this.editorIsReady() && this.tinymceInstance.queryCommandState(name);\n    }\n\n    public execCommand(name: string, value: string | number = null) {\n        this.waitForEditor().then(() => {\n            this.zone.run(() => {\n                this.tinymceInstance.execCommand(name, false, value);\n            });\n        });\n    }\n\n    public getContents(params?: Object): string {\n        if (!this.editorIsReady()) return '';\n        return this.tinymceInstance.getContent(params);\n    }\n\n    public setContents(contents: string) {\n        this.waitForEditor().then(() => {\n            if (!this.tinymceInstance.undoManager) return;\n\n            this.tinymceInstance.undoManager.transact(() => {\n                this.tinymceInstance.setContent(contents);\n            });\n\n            this.tinymceInstance.selection.setCursorLocation();\n            this.tinymceInstance.nodeChanged();\n            this.tinymceInstance.execCommand('mceResize');\n        });\n    }\n\n    /**\n     * Insert specified contents at the end of tinymce.\n     */\n    public insertContents(contents) {\n        this.waitForEditor().then(() => {\n            this.tinymceInstance.execCommand('mceInsertContent', false, contents);\n            setTimeout(() => this.tinymceInstance.selection.collapse());\n        });\n    }\n\n    public insertImage(url: string) {\n        this.waitForEditor().then(() => {\n            this.insertContents('<img src=\"' + url + '\"/>');\n            setTimeout(() => this.execCommand('mceAutoResize'), 500);\n        });\n    }\n\n    public waitForEditor(): Promise<Editor> {\n        // editor already bootstrapped\n        if (this.tinymceInstance) {\n            return new Promise(resolve => resolve(this.tinymceInstance));\n        }\n        // editor is still bootstrapping\n        if (this.bootstrapPromise) {\n            return this.bootstrapPromise as Promise<Editor>;\n        }\n    }\n\n    public setConfig(config: object) {\n        this.config = config;\n        this.loadTinymce().then(() => {\n            this.initTinymce();\n        });\n    }\n\n    private editorIsReady(): boolean {\n        return (\n            !this.bootstrapPromise &&\n            !!this.tinymceInstance &&\n            !!this.tinymceInstance.undoManager\n        );\n    }\n\n    private loadTinymce(): Promise<any> {\n        return this.lazyLoader.loadAsset('js/tinymce/tinymce.min.js', {\n            type: 'js',\n        });\n    }\n\n    private initTinymce() {\n        const config: any = {\n            target: this.config.textAreaEl.nativeElement,\n            plugins: ['link', 'codesample', 'paste', 'autoresize'],\n            branding: false,\n            browser_spellcheck: true,\n            max_height: this.config.maxHeight,\n            min_height: this.config.minHeight,\n            autoresize_on_init: false,\n            paste_as_text: true,\n            elementpath: false,\n            statusbar: false,\n            entity_encoding: 'raw',\n            menubar: false,\n            toolbar: false,\n            convert_urls: false,\n            forced_root_block: false,\n            document_base_url: document.baseURI,\n            element_format: 'html',\n            body_class: 'editor-body',\n            content_style: `html {font-size: 62.5%;}\n.editor-body {font-size: 1.4rem;font-family: \"Roboto\", \"Helvetica Neue\", sans-serif;color: rgba(0, 0, 0, .87);}\nimg {max-width: 100%}\ncode[class*=language-], pre[class*=language-] {font-size: inherit;} .mce-preview-object {border: none;}`,\n            content_css: [\n                'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic',\n            ],\n            default_link_target: '_blank',\n            link_assume_external_targets: true,\n            target_list: false,\n            link_title: false,\n            image_dimensions: false,\n            image_description: false,\n            setup: editor => {\n                this.tinymceInstance = editor;\n                editor.on('change', () => this.config.onChange.emit(editor.getContent()));\n\n                editor.on('click', () => {\n                    // need to run angular zone on editor (iframe) click\n                    // so custom editor buttons are highlighted properly\n                    this.zone.run(() => {});\n                });\n            },\n            init_instance_callback: editor => {\n                this.bootstrapPromise = false;\n                this.bootstrapPromiseResolve(this.tinymceInstance);\n\n                const onEnter = () => {\n                    this.zone.run(() => {\n                        this.config.onChange.emit(editor.getContent());\n                        this.config.onCtrlEnter.emit();\n                    });\n                };\n\n                editor.shortcuts.add('ctrl+13', 'desc', onEnter);\n                if (window.navigator.platform.toLowerCase().includes('mac')) {\n                    editor.shortcuts.add('meta+13', 'desc', onEnter);\n                }\n            },\n        };\n\n        if (this.config['showAdvancedControls']) {\n            config.plugins = config.plugins.concat([\n                'media',\n                'hr',\n                'visualblocks',\n                'visualchars',\n                'wordcount',\n            ]);\n            config.forced_root_block = 'p';\n            config.statusbar = true;\n            config.autoresize_on_init = true;\n            config.extended_valid_elements =\n                'svg[*],use[*],iframe[src|frameborder|width|height|allow=*|allowfullscreen],script[src]';\n            config.elementpath = true;\n            config.content_css.push(\n                this.settings.getAssetUrl() + 'css/advanced-editor-styles.css'\n            );\n            config.target_list = [\n                {title: this.i18n.t('Current window'), value: ''},\n                {title: this.i18n.t('New Window'), value: '_blank'},\n            ];\n            config.codesample_languages = [\n                {text: 'HTML/XML', value: 'markup'},\n                {text: 'JavaScript', value: 'javascript'},\n                {text: 'CSS', value: 'css'},\n                {text: 'Shell', value: 'shell-session'},\n                {text: 'Bash', value: 'bash'},\n                {text: 'PHP', value: 'php'},\n                {text: 'Ruby', value: 'ruby'},\n                {text: 'Python', value: 'python'},\n                {text: 'Java', value: 'java'},\n                {text: 'C', value: 'c'},\n                {text: 'C#', value: 'csharp'},\n                {text: 'C++', value: 'cpp'},\n            ];\n        }\n\n        if (this.config['minHeight'] === 'auto') {\n            const height =\n                this.config.editorEl.nativeElement.parentElement.offsetHeight -\n                EDITOR_TOOLBAR_HEIGHT -\n                4;\n            config.min_height = height;\n            config.max_height = height;\n        }\n\n        tinymce.init(config);\n    }\n\n    public destroyEditor() {\n        // catch error that sometimes occurs on EDGE when\n        // trying to destroy editor that is no longer in the DOM\n        try {\n            if (this.tinymceInstance) {\n                this.tinymceInstance.remove();\n            }\n\n            this.tinymceInstance = null;\n            this.makeBootstrapPromise();\n        } catch (e) {\n            //\n        }\n    }\n\n    /**\n     * Create a tinymce bootstrap promise.\n     */\n    private makeBootstrapPromise() {\n        this.bootstrapPromise = new Promise(\n            resolve => (this.bootstrapPromiseResolve = resolve)\n        );\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { UploadValidator } from '../../uploads/validation/upload-validator';\nimport { FileSizeValidation } from '../../uploads/validation/validations/file-size-validation';\nimport { convertToBytes } from '../../core/utils/convertToBytes';\nimport { FileTypeValidation } from '../../uploads/validation/validations/file-type-validation';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class TextEditorImageValidator extends UploadValidator {\n    protected readonly DEFAULT_MAX_SIZE_MB = 3;\n\n    protected initValidations() {\n        const validations = [\n            new FileSizeValidation(\n                {maxSize: convertToBytes(this.DEFAULT_MAX_SIZE_MB, 'MB')},\n                this.i18n\n            ),\n            new FileTypeValidation({types: ['image']}, this.i18n),\n        ];\n\n        this.validations.push(...validations);\n    }\n}\n","<div class=\"editor-header\">\n    <div class=\"toolbar-row\">\n        <div class=\"header-actions\" *ngIf=\"inlineUploadPrefix && currentUser.hasPermission('files.create') && onFileUpload.observers.length\">\n            <button class=\"no-style editor-button\" type=\"button\" [matTooltip]=\"'Add Attachment' | trans\"\n                    (click)=\"openFileUploadDialog()\">\n                <mat-icon svgIcon=\"attachment\"></mat-icon>\n            </button>\n        </div>\n\n        <div class=\"header-actions\" *ngIf=\"!basic\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('codesample')\"\n                    [matTooltip]=\"'Insert Code Sample' | trans\">\n                <mat-icon svgIcon=\"code\"></mat-icon>\n            </button>\n        </div>\n\n        <div class=\"header-actions\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('undo')\"\n                    [class.disabled]=\"!hasUndo()\" [matTooltip]=\"'Undo' | trans\">\n                <mat-icon svgIcon=\"undo\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('redo')\"\n                    [class.disabled]=\"!hasRedo()\" [matTooltip]=\"'Redo' | trans\">\n                <mat-icon svgIcon=\"redo\"></mat-icon>\n            </button>\n        </div>\n\n        <div class=\"header-actions\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('bold')\"\n                    [class.active]=\"queryCommandState('bold')\" [matTooltip]=\"'Bold' | trans\">\n                <mat-icon svgIcon=\"format-bold\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('italic')\"\n                    [class.active]=\"queryCommandState('italic')\" [matTooltip]=\"'Italic' | trans\">\n                <mat-icon svgIcon=\"format-italic\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('underline')\"\n                    [class.active]=\"queryCommandState('underline')\" [matTooltip]=\"'Underline' | trans\">\n                <mat-icon svgIcon=\"format-underlined\"></mat-icon>\n            </button>\n        </div>\n\n        <div class=\"header-actions\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('insertunorderedlist')\"\n                    [class.active]=\"queryCommandState('unorderedlist')\" [matTooltip]=\"'Unordered List' | trans\">\n                <mat-icon svgIcon=\"format-list-bulleted\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('insertorderedlist')\"\n                    [class.active]=\"queryCommandState('orderedlist')\" [matTooltip]=\"'Ordered List' | trans\">\n                <mat-icon svgIcon=\"format-list-numbered\"></mat-icon>\n            </button>\n        </div>\n\n        <div class=\"header-actions\" *ngIf=\"!basic\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('mceLink')\"\n                    [class.active]=\"queryCommandState('link')\" [matTooltip]=\"'Insert Link' | trans\">\n                <mat-icon svgIcon=\"link\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button image-modal-button\" (click)=\"openInsertImageModal()\"\n                    *ngIf=\"currentUser.hasPermission('files.create')\" [matTooltip]=\"'Insert Image' | trans\">\n                <mat-icon svgIcon=\"image\"></mat-icon>\n            </button>\n        </div>\n\n        <ng-content select=\"[customButtons]\"></ng-content>\n\n        <div class=\"header-actions last\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('removeformat')\"\n                    [matTooltip]=\"'Remove Formatting' | trans\">\n                <mat-icon svgIcon=\"format-clear\"></mat-icon>\n            </button>\n        </div>\n\n        <ng-content select=\"[header]\"></ng-content>\n    </div>\n    <div class=\"toolbar-row\" *ngIf=\"showAdvancedControls\">\n        <div class=\"header-actions\">\n            <button type=\"button\" [matMenuTriggerFor]=\"insertMenu\"\n                    class=\"no-style editor-button text-button insert-button\">\n                <span trans>Insert</span>\n                <mat-icon svgIcon=\"arrow-drop-down\" class=\"caret\"></mat-icon>\n            </button>\n            <mat-menu #insertMenu>\n                <div mat-menu-item (click)=\"execCommand('InsertHorizontalRule')\">\n                    <mat-icon svgIcon=\"remove\"></mat-icon>\n                    <span trans>Horizontal Line</span>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('mceLink')\">\n                    <mat-icon svgIcon=\"link\"></mat-icon>\n                    <span trans>Link</span>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('mceMedia')\">\n                    <mat-icon svgIcon=\"videocam\"></mat-icon>\n                    <span trans>Media</span>\n                </div>\n                <div mat-menu-item (click)=\"insertInfoContainer('important')\" trans>\n                    <mat-icon svgIcon=\"star\"></mat-icon>\n                    <span trans>Important</span>\n                </div>\n                <div mat-menu-item (click)=\"insertInfoContainer('warning')\" trans>\n                    <mat-icon svgIcon=\"warning\"></mat-icon>\n                    <span trans>Warning</span>\n                </div>\n                <div mat-menu-item (click)=\"insertInfoContainer('note')\" trans>\n                    <mat-icon svgIcon=\"note\"></mat-icon>\n                    <span trans>Note</span>\n                </div>\n            </mat-menu>\n        </div>\n        <div class=\"header-actions\">\n            <button type=\"button\" [matMenuTriggerFor]=\"formatMenu\" class=\"no-style editor-button text-button format-button\">\n                <span trans>Format</span>\n                <mat-icon svgIcon=\"arrow-drop-down\" class=\"caret\"></mat-icon>\n            </button>\n            <mat-menu #formatMenu class=\"format-menu menu-with-alt-text\">\n                <div mat-menu-item (click)=\"execCommand('FormatBlock', 'h1')\">\n                    <div class=\"text\" trans>Heading 1</div>\n                    <div class=\"alt-text\">Alt+Shift+1</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('FormatBlock', 'h2')\">\n                    <div class=\"text\" trans>Heading 2</div>\n                    <div class=\"alt-text\">Alt+Shift+2</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('FormatBlock', 'h3')\">\n                    <div class=\"text\" trans>Heading 3</div>\n                    <div class=\"alt-text\">Alt+Shift+3</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('FormatBlock', 'h4')\">\n                    <div class=\"text\" trans>Heading 4</div>\n                    <div class=\"alt-text\">Alt+Shift+4</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('FormatBlock', 'code')\">\n                    <div class=\"text\" trans>Code</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('strikethrough')\">\n                    <div class=\"text\" trans>Strikethrough</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('superscript')\">\n                    <div class=\"text\" trans>Superscript</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('subscript')\">\n                    <div class=\"text\" trans>Subscript</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('mceBlockQuote')\">\n                    <div class=\"text\" trans>Blockquote</div>\n                </div>\n                <div mat-menu-item (click)=\"execCommand('FormatBlock', 'p')\">\n                    <div class=\"text\" trans>Paragraph</div>\n                    <div class=\"alt-text\">Ctrl+Shift+7</div>\n                </div>\n            </mat-menu>\n        </div>\n        <div class=\"header-actions\">\n            <button type=\"button\" [matMenuTriggerFor]=\"colorMenu\" class=\"no-style editor-button text-button color-button\" #colorPickerOrigin>\n                <span trans>Color</span>\n                <mat-icon svgIcon=\"arrow-drop-down\" class=\"caret\"></mat-icon>\n            </button>\n            <mat-menu #colorMenu class=\"color-dropdown\">\n                <div mat-menu-item class=\"text-color-item\" (click)=\"showColorPicker('ForeColor', colorPickerOrigin)\">\n                    <mat-icon svgIcon=\"format-color-text\"></mat-icon>\n                    <span trans>Text Color</span>\n                </div>\n                <div mat-menu-item class=\"bg-color-item\" (click)=\"showColorPicker('HiliteColor', colorPickerOrigin)\">\n                    <mat-icon svgIcon=\"format-color-fill\"></mat-icon>\n                    <span trans>Background Color</span>\n                </div>\n            </mat-menu>\n        </div>\n        <div class=\"header-actions\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('justifyLeft')\"\n                    [class.active]=\"queryCommandState('justifyLeft')\" [matTooltip]=\"'Align Left' | trans\">\n                <mat-icon svgIcon=\"format-align-left\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('justifyCenter')\"\n                    [class.active]=\"queryCommandState('justifyCenter')\" [matTooltip]=\"'Center' | trans\">\n                <mat-icon svgIcon=\"format-align-center\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('justifyRight')\"\n                    [class.active]=\"queryCommandState('justifyRight')\" [matTooltip]=\"'Align Right' | trans\">\n                <mat-icon svgIcon=\"format-align-right\"></mat-icon>\n            </button>\n        </div>\n        <div class=\"header-actions\">\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('Outdent')\" [matTooltip]=\"'Decrease Indent' | trans\">\n                <mat-icon svgIcon=\"format-indent-decrease\"></mat-icon>\n            </button>\n            <button type=\"button\" class=\"no-style editor-button\" (click)=\"execCommand('Indent')\" [matTooltip]=\"'Increase Indent' | trans\">\n                <mat-icon svgIcon=\"format-indent-increase\"></mat-icon>\n            </button>\n        </div>\n        <div class=\"header-actions editor-toggle-buttons\">\n            <button type=\"button\" class=\"no-style editor-button visual-mode-button\"\n                    [class.active]=\"activeEditor === 'visual'\" (click)=\"showVisualEditor()\" trans>Visual\n            </button>\n            <button type=\"button\" class=\"no-style editor-button source-mode-button\"\n                    [class.active]=\"activeEditor === 'source'\" (click)=\"showSourceEditor()\" trans>Source\n            </button>\n        </div>\n    </div>\n</div>\n\n<textarea class=\"source-textarea\" #sourceArea rows=\"8\" [style.min-height]=\"minHeight\" style=\"display: none\" [formControl]=\"sourceAreaControl\" (blur)=\"setContents(sourceAreaControl.value)\"></textarea>\n<textarea class=\"visual-textarea\" #visualArea rows=\"8\" [style.min-height]=\"minHeight\"></textarea>\n\n<ng-content select=\"[footer]\"></ng-content>\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Input,\n    OnDestroy,\n    Output,\n    Renderer2,\n    ViewChild\n} from '@angular/core';\nimport {TinymceTextEditor} from './editors/tinymce-text-editor.service';\nimport {Settings} from '../core/config/settings.service';\nimport {OverlayPanel} from '../core/ui/overlay-panel/overlay-panel.service';\nimport {openUploadWindow} from '../uploads/utils/open-upload-window';\nimport {UploadQueueService} from '../uploads/upload-queue/upload-queue.service';\nimport {TextEditorImageValidator} from './validation/text-editor-image-validator';\nimport {UploadInputTypes} from '../uploads/upload-input-config';\nimport {CurrentUser} from '../auth/current-user';\nimport {BOTTOM_POSITION} from '../core/ui/overlay-panel/positions/bottom-position';\nimport {ucFirst} from '../core/utils/uc-first';\nimport {FormControl} from '@angular/forms';\nimport {debounceTime} from 'rxjs/operators';\nimport {UploadUri} from '@common/uploads/types/upload-uri.enum';\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport interface LinkAttrs {\n    text: string;\n    href: string;\n    target?: string;\n}\n\n@Component({\n    selector: 'text-editor',\n    templateUrl: './text-editor.component.html',\n    styleUrls: ['./text-editor.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        UploadQueueService,\n        TinymceTextEditor,\n    ]\n})\nexport class TextEditorComponent implements OnDestroy, AfterViewInit {\n    @ViewChild('visualArea', { static: true }) visualTextArea: ElementRef;\n    @ViewChild('sourceArea', { static: true }) sourceTextArea: ElementRef;\n\n    public sourceAreaControl = new FormControl();\n    public activeEditor = 'visual';\n\n    @Input() showAdvancedControls = false;\n    @Input() basic = false;\n    @Input() minHeight: number|string = 183;\n    @Input() maxHeight = 530;\n    @Input() inlineUploadPrefix: string;\n\n    @Output() onChange: EventEmitter<string> = new EventEmitter();\n    @Output() onCtrlEnter = new EventEmitter();\n    @Output() onFileUpload = new EventEmitter<UploadedFile[]>();\n\n    constructor(\n        public editor: TinymceTextEditor,\n        public currentUser: CurrentUser,\n        private uploadQueue: UploadQueueService,\n        private settings: Settings,\n        private renderer: Renderer2,\n        public el: ElementRef,\n        private overlayPanel: OverlayPanel,\n        private imageValidator: TextEditorImageValidator,\n    ) {}\n\n    ngAfterViewInit() {\n        this.bootTextEditor();\n    }\n\n    ngOnDestroy() {\n        this.destroyEditor();\n    }\n\n    public reset() {\n        this.editor.reset();\n    }\n\n    public focus() {\n        this.editor.focus();\n    }\n\n    public hasUndo(): boolean {\n        return this.editor.hasUndo();\n    }\n\n    public hasRedo(): boolean {\n        return this.editor.hasRedo();\n    }\n\n    /**\n     * Queries the current state for specified text editor command.\n     * For example if the current selection is \"bold\".\n     */\n    public queryCommandState(name: string): boolean|number {\n        return this.editor.queryCommandState(name);\n    }\n\n    public execCommand(name: string, value: string|number = null) {\n        this.editor.execCommand(name, value);\n    }\n\n    /**\n     * Insert information container of specified type into the editor.\n     */\n    public insertInfoContainer(type: string) {\n        // TODO: refactor into shortcodes maybe if need more of similar buttons in the future\n        // TODO: translate once angular translation service is available\n        this.insertContents(\n            `<div class=\"widget widget-${type}\"><div class=\"title\">${ucFirst(type)}:</div><br></div><br>`\n        );\n    }\n\n    public async showColorPicker(command: string, origin: HTMLElement) {\n        const { BeColorPickerModule } = await import('@common/core/ui/color-picker/be-color-picker.module');\n        this.overlayPanel.open(BeColorPickerModule.components.panel, {origin: new ElementRef(origin), position: BOTTOM_POSITION})\n            .valueChanged().pipe(debounceTime(50)).subscribe(color => {\n                this.execCommand(command, color);\n            });\n    }\n\n    public showVisualEditor() {\n        if ( ! this.editor.tinymceInstance.contentAreaContainer || this.activeEditor === 'visual') return;\n\n        this.activeEditor = 'visual';\n\n        this.renderer.setStyle(this.editor.tinymceInstance.contentAreaContainer, 'display', 'block');\n        this.renderer.setStyle(this.sourceTextArea.nativeElement, 'display', 'none');\n\n        this.editor.focus();\n    }\n\n    public showSourceEditor() {\n        if ( ! this.editor.tinymceInstance.contentAreaContainer || this.activeEditor === 'source') return;\n\n        this.activeEditor = 'source';\n\n        this.renderer.setStyle(this.sourceTextArea.nativeElement, 'height', this.editor.tinymceInstance.contentAreaContainer.offsetHeight + 'px');\n        this.renderer.setStyle(this.sourceTextArea.nativeElement, 'display', 'block');\n        this.renderer.setStyle(this.editor.tinymceInstance.contentAreaContainer, 'display', 'none');\n\n        this.sourceAreaControl.setValue(this.editor.getContents({source_view: true}));\n    }\n\n    public openFileUploadDialog() {\n        openUploadWindow({multiple: true}).then(fileList => {\n            this.onFileUpload.emit(fileList);\n        });\n    }\n\n    public openInsertImageModal() {\n        const params: UploadApiConfig = {\n            uri: UploadUri.Image,\n            validator: this.imageValidator,\n            httpParams: {diskPrefix: this.inlineUploadPrefix}\n        };\n        openUploadWindow({types: [UploadInputTypes.image]}).then(files => {\n            this.uploadQueue.start(files, params).subscribe(response => {\n                this.insertImage(response.fileEntry.url);\n            });\n        });\n    }\n\n    public getContents(): string {\n        return this.editor.getContents();\n    }\n\n    public setContents(contents: string) {\n        this.editor.setContents(contents);\n    }\n\n    public insertContents(contents) {\n        this.editor.insertContents(contents);\n    }\n\n    public insertImage(url: string) {\n        this.editor.insertImage(url);\n    }\n\n    public insertLink(attrs: LinkAttrs) {\n        const target = attrs.target || 'self';\n        this.insertContents(`<a href=\"${attrs.href}\" target=\"${target}\">${attrs.text}</a>`);\n    }\n\n    public destroyEditor() {\n        this.editor.destroyEditor();\n    }\n\n    private bootTextEditor() {\n        this.editor.setConfig({\n            textAreaEl: this.visualTextArea,\n            editorEl: this.el,\n            minHeight: this.minHeight,\n            maxHeight: this.maxHeight,\n            onChange: this.onChange,\n            onCtrlEnter: this.onCtrlEnter,\n            showAdvancedControls: this.showAdvancedControls,\n        });\n    }\n}\n","<ng-container *ngIf=\"errors$ | async as errors\" [formGroup]=\"form\">\n    <div class=\"many-inputs input-header\">\n        <div class=\"input-container\">\n            <label for=\"page-title\" trans>Page Title</label>\n            <input type=\"text\" id=\"page-title\" formControlName=\"title\">\n            <div class=\"error\" *ngIf=\"errors.title\">{{errors.title}}</div>\n        </div>\n\n        <div class=\"input-container slug-input-container\" *ngIf=\"!hideSlug\">\n            <slug-control [prefix]=\"slugPrefix()\" formControlName=\"slug\"></slug-control>\n            <div class=\"error\" *ngIf=\"errors.slug\">{{errors.slug}}</div>\n        </div>\n\n        <div class=\"setting-toggle-container\">\n            <mat-slide-toggle id=\"crupdate_custom_page.hideNav\" formControlName=\"hide_nav\" trans>Hide Navbar</mat-slide-toggle>\n            <p trans>Whether default site navbar should be hidden for this page.</p>\n        </div>\n    </div>\n\n    <div class=\"actions\">\n        <button mat-raised-button color=\"accent\" (click)=\"crupdatePage()\">\n            <span *ngIf=\"page\" trans>Update</span>\n            <span *ngIf=\"!page\" trans>Create</span>\n        </button>\n        <a mat-button [routerLink]=\"backRoute()\" trans>Cancel</a>\n    </div>\n\n    <div class=\"errors\">\n        <div class=\"error\" *ngIf=\"errors.body\">{{errors.body}}</div>\n    </div>\n\n    <div class=\"editor-container\">\n        <text-editor inlineUploadPrefix=\"page_media\" class=\"text-editor\" minHeight=\"auto\" (onChange)=\"setBody($event)\" [showAdvancedControls]=\"true\"></text-editor>\n    </div>\n\n    <loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n</ng-container>\n","import {ChangeDetectionStrategy, Component, OnInit, ViewChild} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {delay, finalize} from 'rxjs/operators';\nimport {TextEditorComponent} from '../../../text-editor/text-editor.component';\nimport {CustomPage} from '../../../core/types/models/CustomPage';\nimport {Pages} from '../../shared/pages.service';\nimport {Toast} from '../../../core/ui/toast.service';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormBuilder} from '@angular/forms';\nimport {bindSlugTo} from '../../../shared/form-controls/slug-control/bind-slug-to';\nimport {BackendErrorResponse} from '../../../core/types/backend-error-response';\n\n@Component({\n    selector: 'crupdate-page',\n    templateUrl: './crupdate-custom-page.component.html',\n    styleUrls: ['./crupdate-custom-page.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CrupdateCustomPageComponent implements OnInit {\n    @ViewChild(TextEditorComponent) textEditor: TextEditorComponent;\n    public hideSlug: boolean = this.route.snapshot.data.hideSlug;\n    public endpoint: string = this.route.snapshot.data.endpoint;\n    public loading$ = new BehaviorSubject<boolean>(false);\n    public updating$ = new BehaviorSubject<boolean>(false);\n    public page: CustomPage;\n    public form = this.fb.group({\n        title: [''],\n        slug: [''],\n        body: [''],\n        type: [''],\n        hide_nav: [false],\n    });\n    public errors$ = new BehaviorSubject<{\n        body?: string,\n        slug?: string,\n        title?: string,\n    }>({});\n\n    constructor(\n        private pages: Pages,\n        private route: ActivatedRoute,\n        private toast: Toast,\n        private router: Router,\n        private fb: FormBuilder,\n    ) {}\n\n    ngOnInit() {\n        this.route.params.subscribe(params => {\n            this.getPage(params.id);\n        });\n\n        if ( ! this.route.snapshot.data.hideSlug) {\n            bindSlugTo(this.form.get('title'));\n        }\n    }\n\n    public crupdatePage() {\n        this.loading$.next(true);\n        const request = this.updating$.value ?\n            this.pages.update(this.page.id, this.getPayload(), this.endpoint) :\n            this.pages.create(this.getPayload(), this.endpoint);\n\n        request.pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(() => {\n                this.router.navigate(this.backRoute(), {relativeTo: this.route});\n                this.toast.open(this.updating$.value ? 'Page updated' : 'Page created');\n            }, (errResponse: BackendErrorResponse) => this.errors$.next(errResponse.errors));\n    }\n\n    public getPage(id: number) {\n        if ( ! id) return;\n        this.loading$.next(true);\n        this.pages.get(id).pipe(delay(0)).subscribe(response => {\n            this.updating$.next(true);\n            this.page = response.page;\n            this.form.patchValue(response.page);\n            this.textEditor.setContents(response.page.body || '');\n            this.loading$.next(false);\n        });\n    }\n\n    private getPayload(): CustomPage {\n        return {...this.form.value};\n    }\n\n    public setBody(content: string) {\n        this.form.patchValue({body: content});\n    }\n\n    public backRoute() {\n        return this.page ? ['../../'] : ['../'];\n    }\n\n    public slugPrefix() {\n        return 'pages/' + (this.page ? this.page.id : '*');\n    }\n}\n","import {AbstractControl} from '@angular/forms';\nimport {distinctUntilChanged, filter} from 'rxjs/operators';\nimport {slugifyString} from '@common/core/utils/slugify-string';\n\nexport function bindSlugTo(control: AbstractControl) {\n    control.valueChanges\n        .pipe(filter(value => !!value), distinctUntilChanged())\n        .subscribe(value => {\n            if ( ! control.parent.get('slug').dirty) {\n                control.parent.get('slug').setValue(slugifyString(value));\n            }\n        });\n}\n","import {\n    DatatableFilter,\n    FilterControlType,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport {FindUserModalComponent} from '@common/auth/find-user-modal/find-user-modal.component';\nimport {\n    CreatedAtFilter,\n    UpdatedAtFilter,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/timestamp-filter';\n\nexport const CUSTOM_PAGE_FILTERS: DatatableFilter[] = [\n    new UpdatedAtFilter({\n        description: 'Date the page was last updated',\n    }),\n    new CreatedAtFilter({\n        description: 'Date the page was created',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'user_id',\n        label: 'User',\n        description: 'User page was created by',\n        component: FindUserModalComponent,\n    }),\n];\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {CustomPagesIndexComponent} from './custom-pages-index.component';\nimport {CrupdateCustomPageComponent} from './crupdate-custom-page/crupdate-custom-page.component';\nimport {DatatableModule} from '../../datatable/datatable.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {TranslationsModule} from '../../core/translations/translations.module';\nimport {RouterModule} from '@angular/router';\nimport {FormatPipesModule} from '../../core/ui/format-pipes/format-pipes.module';\nimport {NoResultsMessageModule} from '../../core/ui/no-results-message/no-results-message.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {SlugControlModule} from '../../shared/form-controls/slug-control/slug-control.module';\nimport {TextEditorModule} from '../../text-editor/text-editor.module';\nimport {LoadingIndicatorModule} from '../../core/ui/loading-indicator/loading-indicator.module';\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n@NgModule({\n    declarations: [CustomPagesIndexComponent, CrupdateCustomPageComponent],\n    imports: [\n        CommonModule,\n        RouterModule,\n        DatatableModule,\n        TranslationsModule,\n        FormatPipesModule,\n        NoResultsMessageModule,\n        TextEditorModule,\n        LoadingIndicatorModule,\n\n        FormsModule,\n        ReactiveFormsModule,\n        SlugControlModule,\n\n        // material\n        MatIconModule,\n        MatButtonModule,\n        MatTooltipModule,\n        MatSlideToggleModule,\n        MatProgressBarModule,\n    ],\n    exports: [CustomPagesIndexComponent, CrupdateCustomPageComponent],\n})\nexport class CustomPageIndexModule {}\n","<div class=\"datatable-page-header\">\n  <h1 trans>\n    <span trans>Custom Pages</span>\n  </h1>\n\n  <div class=\"header\">\n    <datatable-filters pluralName=\"pages\" [filters]=\"filters\"></datatable-filters>\n    <div class=\"action-buttons\">\n      <a\n        *ngIf=\"currentUser.hasPermission('custom_pages.create')\"\n        mat-raised-button\n        color=\"accent\"\n        routerLink=\"new\"\n        class=\"button-with-icon\"\n      >\n        <mat-icon svgIcon=\"add\"></mat-icon>\n        <span trans>Add New Page</span>\n      </a>\n    </div>\n  </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n  <mat-progress-bar\n    class=\"loading-bar\"\n    mode=\"indeterminate\"\n    color=\"accent\"\n    *ngIf=\"datatable.paginator && datatable.paginator.loading$ | async\"\n  ></mat-progress-bar>\n  <table class=\"material-table\">\n    <thead>\n      <tr>\n        <th table-header-checkbox></th>\n        <th table-sort-header trans>Slug</th>\n        <th table-sort-header=\"user_id\" trans>Owner</th>\n        <th class=\"body-column\" trans>Body</th>\n        <th class=\"type-column\" table-sort-header *ngIf=\"!endpoint\" trans>Type</th>\n        <th trans>Last Updated</th>\n        <th></th>\n      </tr>\n      <tr *ngIf=\"datatable.selectedRows$.value.length as selectedCount\">\n        <th colspan=\"7\">\n          <div\n            class=\"bulk-actions-title\"\n            [transValues]=\"{count: selectedCount, resource: 'page(s)'}\"\n            trans\n          >\n            :count :resource selected:\n          </div>\n          <div class=\"bulk-actions\">\n            <button\n              type=\"button\"\n              mat-raised-button\n              color=\"warn\"\n              (click)=\"maybeDeleteSelectedPages()\"\n              trans\n            >\n              Delete\n            </button>\n          </div>\n        </th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr *ngFor=\"let page of pages$ | async\">\n        <td [table-body-checkbox]=\"page.id\"></td>\n        <td data-label=\"Slug\">\n          <a [href]=\"getPageUrl(page)\" target=\"_blank\">{{ page.slug }}</a>\n        </td>\n        <td data-label=\"Owner\">\n          <user-column [user]=\"page.user\"></user-column>\n        </td>\n        <td data-label=\"Body\" class=\"body-column\">{{ page.body }}</td>\n        <td data-label=\"Type\" class=\"type-column\" *ngIf=\"!endpoint\">\n          {{ page.type ? viewName(page.type) : 'default' }}\n        </td>\n        <td data-label=\"Last Updated\">{{ page.updated_at | formattedDate }}</td>\n        <td class=\"edit-column\">\n          <a\n            [routerLink]=\"[page.id, 'edit']\"\n            mat-icon-button\n            *ngIf=\"currentUser.hasPermission('custom_pages.update')\"\n            [matTooltip]=\"'Edit page' | trans\"\n          >\n            <mat-icon svgIcon=\"edit\"></mat-icon>\n          </a>\n          <button\n            type=\"button\"\n            mat-icon-button\n            (click)=\"maybeDeleteSelectedPages([page.id])\"\n            trans\n          >\n            <mat-icon svgIcon=\"delete\"></mat-icon>\n          </button>\n        </td>\n      </tr>\n    </tbody>\n  </table>\n  <no-results-message svgImage=\"custom-page.svg\" *ngIf=\"datatable.paginator.noResults$ | async\">\n    <span primary-text trans>No pages have been created yet</span>\n  </no-results-message>\n  <datatable-footer></datatable-footer>\n</div>\n","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {CustomPage} from '../../core/types/models/CustomPage';\nimport {Pages} from '../shared/pages.service';\nimport {CurrentUser} from '../../auth/current-user';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {Toast} from '../../core/ui/toast.service';\nimport {BackendErrorResponse} from '../../core/types/backend-error-response';\nimport {HttpErrors} from '../../core/http/errors/http-errors.enum';\nimport {DatatableService} from '../../datatable/datatable.service';\nimport {Settings} from '../../core/config/settings.service';\nimport {Observable} from 'rxjs';\nimport {CUSTOM_PAGE_FILTERS} from '@common/pages/custom-pages-index/cusomt-page-filters';\n\n@Component({\n    selector: 'custom-pages-index',\n    templateUrl: './custom-pages-index.component.html',\n    styleUrls: ['./custom-pages-index.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class CustomPagesIndexComponent implements OnInit {\n    endpoint = this.route.snapshot.data.endpoint;\n    filters = CUSTOM_PAGE_FILTERS;\n    pages$ = this.datatable.data$ as Observable<CustomPage[]>;\n    constructor(\n        public settings: Settings,\n        public datatable: DatatableService<CustomPage>,\n        public currentUser: CurrentUser,\n        protected customPages: Pages,\n        protected toast: Toast,\n        protected router: Router,\n        protected route: ActivatedRoute\n    ) {}\n\n    ngOnInit() {\n        this.datatable.init({\n            uri: this.endpoint || Pages.BASE_URI,\n            staticParams: {with: ['user']},\n        });\n    }\n\n    maybeDeleteSelectedPages(pageIds?: number[]) {\n        this.datatable\n            .confirmResourceDeletion('tracking pixels')\n            .subscribe(() => {\n                this.customPages\n                    .delete(pageIds || this.datatable.selectedRows$.value)\n                    .subscribe(\n                        () => {\n                            this.datatable.reset();\n                            this.toast.open('Pages deleted');\n                        },\n                        (errResponse: BackendErrorResponse) => {\n                            this.toast.open(\n                                errResponse.message || HttpErrors.Default\n                            );\n                        }\n                    );\n            });\n    }\n\n    showUserColumn(): boolean {\n        return this.router.url.indexOf('admin') > -1;\n    }\n\n    getPageUrl(page: CustomPage): string {\n        return (\n            this.settings.getBaseUrl() + '/pages/' + page.id + '/' + page.slug\n        );\n    }\n\n    viewName(name: string) {\n        return name.replace(/_/g, ' ');\n    }\n}\n","import {IBarChartOptions, IChartistData, ILineChartOptions, IPieChartOptions} from 'chartist';\n\nexport enum ChartType {\n    LINE = 'line',\n    PIE = 'pie',\n    BAR = 'bar',\n}\n\ninterface BaseChartConfig {\n    selector?: string|HTMLElement;\n    type: ChartType;\n    labels: string[];\n    legend?: boolean;\n    tooltip?: string;\n    data: number[][]|number[];\n}\n\nexport interface BarChartConfig extends BaseChartConfig {\n    type: ChartType.BAR;\n    options?: IBarChartOptions;\n    data: number[][];\n}\n\nexport interface LineChartConfig extends BaseChartConfig {\n    type: ChartType.LINE;\n    options?: ILineChartOptions;\n    data: number[][];\n}\n\nexport interface PieChartConfig extends BaseChartConfig {\n    type: ChartType.PIE;\n    options?: IPieChartOptions;\n    data: number[];\n}\n\nexport abstract class BaseChart<T extends BaseChartConfig> {\n    constructor(protected config: T) {\n        setTimeout(() => this.generate());\n    }\n\n    protected abstract generate();\n\n    protected abstract transformChartData(): IChartistData;\n\n    protected getMaxValue(): number {\n        if ( ! this.config.data) {\n            return 0;\n        }\n        if (Array.isArray(this.config.data[0])) {\n            return Math.max(...this.config.data[0] as number[], ...(this.config.data[1] || []) as number[]);\n        } else {\n            return Math.max(...this.config.data as number[]);\n        }\n    }\n\n    protected generateDataWithTooltip(data: number[]): any {\n        if (this.config.tooltip) {\n            return data.map(value => {\n                return {value, meta: this.config.tooltip};\n            });\n        } else {\n            return data;\n        }\n    }\n\n    public isEmpty(): boolean {\n        return this.getMaxValue() <= 0;\n    }\n\n    public abstract destroy();\n}\n","import Chartist from 'chartist';\nimport ChartistTooltip from 'chartist-plugin-tooltips-updated';\nimport {IChartistLineChart, ILineChartOptions} from 'chartist';\nimport {BaseChart, LineChartConfig} from '@common/shared/charts/base-chart';\n\nexport class ChartistLine extends BaseChart<LineChartConfig> {\n    protected lineConfig: ILineChartOptions = {\n        showArea: true,\n        lineSmooth: true,\n        low: 0,\n        fullWidth: true,\n        chartPadding: {\n            left: 15,\n            right: 30,\n        },\n        axisY: {\n            // 0,454 => 0,4 when displaying chart with no data\n            labelInterpolationFnc: (val) => Math.floor(val)\n        },\n        plugins: [\n            ChartistTooltip(),\n        ]\n    };\n\n    protected chart: IChartistLineChart;\n\n    protected generate() {\n        const lineConfig = {\n            ...this.lineConfig,\n            high: this.getHigh(),\n            ...(this.config.options || {})\n        };\n        this.chart = new Chartist.Line(\n            this.config.selector,\n            this.transformChartData(),\n            lineConfig,\n        );\n\n        this.chart.on('draw', data =>  {\n            if (data.type === 'line' || data.type === 'area') {\n                data.element.animate({\n                    d: {\n                        begin: data.index,\n                        dur: 250,\n                        from: data.path.clone().scale(1, 0).translate(0, data.chartRect.height()).stringify(),\n                        to: data.path.clone().stringify(),\n                        easing: Chartist.Svg.Easing.easeOutQuint\n                    }\n                });\n            }\n        });\n    }\n\n    protected transformChartData() {\n        return {\n            labels: this.config.labels,\n            series: this.config.data.map(d => this.generateDataWithTooltip(d || [])),\n        };\n    }\n\n    protected getHigh() {\n        // if chart data is empty, show 0-100 in Y axis\n        return this.getMaxValue() ? undefined : 100;\n    }\n\n    public destroy() {\n        if (this.chart) {\n            this.chart.off('draw');\n            this.chart.detach();\n        }\n    }\n}\n","import Chartist from 'chartist';\nimport {IChartistPieChart, IPieChartOptions} from 'chartist';\nimport ChartistTooltip from 'chartist-plugin-tooltips-updated';\nimport {BaseChart, PieChartConfig} from '@common/shared/charts/base-chart';\n\nexport class ChartistPie extends BaseChart<PieChartConfig> {\n    protected pieConfig: IPieChartOptions = {\n        showLabel: false,\n        chartPadding: 0,\n        plugins: [\n            ChartistTooltip(),\n        ]\n    };\n\n    protected chart: IChartistPieChart;\n\n    protected generate() {\n        const options =  {\n            ...this.pieConfig,\n            ...this.config.options || {},\n        };\n        this.chart = new Chartist.Pie(\n            this.config.selector,\n            this.transformChartData(),\n            options,\n        );\n        this.animate();\n    }\n\n    protected transformChartData() {\n        return {\n            labels: this.config.labels,\n            series: this.generateDataWithTooltip(this.config.data),\n        };\n    }\n\n    public destroy() {\n        if (this.chart) {\n            this.chart.off('draw');\n            this.chart.detach();\n        }\n    }\n\n    protected animate() {\n        this.chart.on('draw', data => {\n            if (data.type === 'slice') {\n                const pathLength = data.element._node.getTotalLength();\n                data.element.attr({\n                    'stroke-dasharray': pathLength + 'px ' + pathLength + 'px'\n                });\n                const animationDefinition = {\n                    'stroke-dashoffset': {\n                        id: 'anim' + data.index,\n                        dur: 300 * data.value / data.totalDataSum,\n                        from: -pathLength + 'px',\n                        to: '0px',\n                        fill: 'freeze'\n                    }\n                };\n                if (data.index !== 0) {\n                    animationDefinition['stroke-dashoffset']['begin'] = 'anim' + (data.index - 1) + '.end';\n                }\n                data.element.attr({\n                    'stroke-dashoffset': -pathLength + 'px'\n                });\n                data.element.animate(animationDefinition, false);\n                if (data.endAngle === 360) {\n                    let index = data.index;\n                    let dur = 1000 * data.value / data.totalDataSum / 2;\n                    let from = 0;\n                    let to = -pathLength / 3;\n                    for (let i = 0; i < 4; i++) {\n                        data.element.animate({\n                            'stroke-dashoffset': {\n                                id: 'anim' + (index + 1),\n                                dur: dur,\n                                from: from + 'px',\n                                to: to + 'px',\n                                fill: 'freeze',\n                                begin: 'anim' + index + '.end'\n                            }\n                        }, false);\n                        index++;\n                        dur /= 1.75;\n                        const t = from;\n                        from = to;\n                        to = t / 2.5;\n                    }\n                }\n            }\n        });\n    }\n}\n","import Chartist from 'chartist';\nimport ChartistTooltip from 'chartist-plugin-tooltips-updated';\nimport {IBarChartOptions, IChartistBarChart} from 'chartist';\nimport {BarChartConfig, BaseChart} from '@common/shared/charts/base-chart';\n\nexport class ChartistBar extends BaseChart<BarChartConfig> {\n    protected barConfig: IBarChartOptions = {\n        chartPadding: {\n            left: 15,\n            right: 30,\n        },\n        plugins: [\n            ChartistTooltip(),\n        ]\n    };\n\n    protected chart: IChartistBarChart;\n\n    protected generate() {\n        const barConfig: IBarChartOptions = {\n            ...this.barConfig,\n            ...(this.config.options || {}),\n            high: this.getHigh(),\n        };\n        this.chart = new Chartist.Bar(\n            this.config.selector,\n            this.transformChartData(),\n            barConfig,\n        );\n        this.chart.on('draw', function(data) {\n            if (data.type === 'bar') {\n                data.element.animate({\n                    y2: {\n                        dur: '0.2s',\n                        from: data.y1,\n                        to: data.y2\n                    }\n                });\n            }\n        });\n    }\n\n    protected transformChartData() {\n        return {\n            labels: this.config.labels,\n            series: this.config.data.map(d => this.generateDataWithTooltip(d || [])),\n        };\n    }\n\n    protected getHigh() {\n        // if chart data is empty, show 0-100 in Y axis\n        return this.getMaxValue() ? undefined : 100;\n    }\n\n    public destroy() {\n        if (this.chart) {\n            this.chart.off('draw');\n            this.chart.detach();\n        }\n    }\n}\n","<div class=\"header-wrapper\" #headerWrapper>\n    <ng-content select=\".chart-header\"></ng-content>\n</div>\n\n<div #chartPlaceholder class=\"ct-chart ct-perfect-fourth {{chartConfig?.type}}-chart chart-body\">\n    <div *ngIf=\"chart && chart.isEmpty()\" class=\"empty-msg\">\n        <mat-icon svgIcon=\"warning\"></mat-icon>\n        <span trans>No data available for this time period.</span>\n    </div>\n</div>\n\n<div class=\"legend-wrapper\" #legendWrapper>\n    <ng-content select=\".chart-legend\"></ng-content>\n    <div class=\"chart-legend\" *ngIf=\"chartConfig?.legend\">\n        <div class=\"legend-item\" *ngFor=\"let item of chartConfig.labels\">{{item}}</div>\n    </div>\n</div>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    Input,\n    OnChanges,\n    OnDestroy,\n    OnInit,\n    ViewChild,\n    ViewEncapsulation\n} from '@angular/core';\nimport {BarChartConfig, BaseChart, ChartType, LineChartConfig, PieChartConfig} from '@common/shared/charts/base-chart';\nimport {ChartistLine} from '@common/shared/charts/chartist/chartist-line';\nimport {ChartistPie} from '@common/shared/charts/chartist/chartist-pie';\nimport {ChartistBar} from '@common/shared/charts/chartist/chartist-bar';\n\ntype ChartConfig = BarChartConfig|LineChartConfig|PieChartConfig;\n\n@Component({\n    selector: 'chart',\n    templateUrl: './chart.component.html',\n    styleUrls: ['./chart.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {'class': 'chart'},\n})\nexport class ChartComponent implements OnInit, OnChanges, OnDestroy {\n    @ViewChild('headerWrapper', {static: true}) headerWrapper: ElementRef<HTMLElement>;\n    @ViewChild('legendWrapper', {static: true}) legendWrapper: ElementRef<HTMLElement>;\n    @ViewChild('chartPlaceholder', { static: true }) chartPlaceholder: ElementRef<HTMLElement>;\n\n    @Input() chartConfig: ChartConfig;\n    @Input() height: number;\n    public chart: BaseChart<ChartConfig>;\n\n    constructor(protected el: ElementRef<HTMLElement>) {}\n\n    ngOnInit() {\n        this.calcAndSetChartHeight();\n    }\n\n    ngOnChanges() {\n        if ( ! this.chartConfig) return;\n        if (this.chartConfig.type === ChartType.LINE) {\n            this.chart = new ChartistLine(this.transformConfig() as LineChartConfig);\n        } else if (this.chartConfig.type === ChartType.BAR) {\n            this.chart = new ChartistBar(this.transformConfig() as BarChartConfig);\n        } else {\n            this.chart = new ChartistPie(this.transformConfig() as PieChartConfig);\n        }\n    }\n\n    ngOnDestroy() {\n        if ( ! this.chart) return;\n        this.chart.destroy();\n    }\n\n    private transformConfig(): ChartConfig {\n        return {\n            ...this.chartConfig,\n            selector: this.chartPlaceholder.nativeElement\n        };\n    }\n\n    private calcAndSetChartHeight() {\n        let innerHeight = this.height;\n        const headerMargin = 15;\n        if (this.headerWrapper.nativeElement.children.length) {\n            innerHeight -= 66; // header height\n        }\n        if ((this.chartConfig && this.chartConfig.legend) || this.legendWrapper.nativeElement.children.length) {\n            innerHeight -= 40; // legend height\n        }\n        this.el.nativeElement.style.height = this.height + 'px';\n        this.chartPlaceholder.nativeElement.style.height = (innerHeight - headerMargin) + 'px';\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ChartComponent} from '@common/shared/charts/chart/chart.component';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatIconModule} from '@angular/material/icon';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        TranslationsModule,\n\n        // material\n        MatIconModule,\n    ],\n    declarations: [\n        ChartComponent\n    ],\n    exports: [\n        ChartComponent,\n    ]\n})\nexport class ChartsModule {\n}\n","<mat-icon svgIcon=\"link\" class=\"link-icon\"></mat-icon>\n<ng-container *ngIf=\"editing$ | async; else editButton\">\n  <div class=\"nowrap\">{{ fullBaseUri + getPrefix() }}</div>\n  <div class=\"input-container\">\n    <input type=\"text\" [formControl]=\"slugControl\" />\n  </div>\n  <button type=\"button\" mat-flat-button color=\"gray\" class=\"action-button\" (click)=\"save()\" trans>\n    Save\n  </button>\n</ng-container>\n\n<ng-template #editButton>\n  <ng-container *ngIf=\"fullBaseUri + getPrefix() + (slug$ | async) as fullUrl\">\n    <a class=\"nowrap\" [href]=\"fullUrl\" target=\"_blank\" [title]=\"fullUrl\">{{ fullUrl }}</a>\n  </ng-container>\n  <button\n    type=\"button\"\n    mat-flat-button\n    color=\"gray\"\n    class=\"action-button\"\n    (click)=\"startEditing()\"\n    trans\n  >\n    Edit\n  </button>\n</ng-template>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {Settings} from '@common/core/config/settings.service';\n\n@Component({\n    selector: 'slug-control',\n    templateUrl: './slug-control.component.html',\n    styleUrls: ['./slug-control.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: SlugControlComponent,\n        multi: true,\n    }]\n})\nexport class SlugControlComponent implements ControlValueAccessor {\n    private propagateChange: Function;\n    slug$ = new BehaviorSubject<string>('');\n    editing$ = new BehaviorSubject<boolean>(false);\n    slugControl = new FormControl();\n    @Input() prefix: string;\n\n    @Input() set baseUri(uri: string) {\n        uri = uri || this.defaultBaseUri;\n        this.fullBaseUri = uri.endsWith('/') ? uri : uri + '/';\n    }\n    private defaultBaseUri: string = this.settings.getBaseUrl() + '/';\n    fullBaseUri = this.defaultBaseUri;\n\n    constructor(public settings: Settings) {}\n\n    writeValue(value: string) {\n        this.slug$.next(value);\n        this.slugControl.setValue(value);\n    }\n\n    registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    registerOnTouched() {}\n\n    save() {\n        this.slug$.next(this.slugControl.value);\n        this.propagateChange(this.slug$.value);\n        this.editing$.next(false);\n    }\n\n    startEditing() {\n        this.editing$.next(true);\n    }\n\n    getPrefix() {\n        return this.prefix ? this.prefix + '/' : '';\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SlugControlComponent} from './slug-control.component';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\n\n\n@NgModule({\n    declarations: [SlugControlComponent],\n    imports: [\n        CommonModule,\n        ReactiveFormsModule,\n        MatButtonModule,\n        TranslationsModule,\n        MatIconModule,\n    ],\n    exports: [\n        SlugControlComponent,\n    ]\n})\nexport class SlugControlModule {\n}\n","import { SimpleOuterSubscriber, innerSubscribe, SimpleInnerSubscriber } from '../innerSubscribe';\nexport const defaultThrottleConfig = {\n    leading: true,\n    trailing: false\n};\nexport function throttle(durationSelector, config = defaultThrottleConfig) {\n    return (source) => source.lift(new ThrottleOperator(durationSelector, !!config.leading, !!config.trailing));\n}\nclass ThrottleOperator {\n    constructor(durationSelector, leading, trailing) {\n        this.durationSelector = durationSelector;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    call(subscriber, source) {\n        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));\n    }\n}\nclass ThrottleSubscriber extends SimpleOuterSubscriber {\n    constructor(destination, durationSelector, _leading, _trailing) {\n        super(destination);\n        this.destination = destination;\n        this.durationSelector = durationSelector;\n        this._leading = _leading;\n        this._trailing = _trailing;\n        this._hasValue = false;\n    }\n    _next(value) {\n        this._hasValue = true;\n        this._sendValue = value;\n        if (!this._throttled) {\n            if (this._leading) {\n                this.send();\n            }\n            else {\n                this.throttle(value);\n            }\n        }\n    }\n    send() {\n        const { _hasValue, _sendValue } = this;\n        if (_hasValue) {\n            this.destination.next(_sendValue);\n            this.throttle(_sendValue);\n        }\n        this._hasValue = false;\n        this._sendValue = undefined;\n    }\n    throttle(value) {\n        const duration = this.tryDurationSelector(value);\n        if (!!duration) {\n            this.add(this._throttled = innerSubscribe(duration, new SimpleInnerSubscriber(this)));\n        }\n    }\n    tryDurationSelector(value) {\n        try {\n            return this.durationSelector(value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return null;\n        }\n    }\n    throttlingDone() {\n        const { _throttled, _trailing } = this;\n        if (_throttled) {\n            _throttled.unsubscribe();\n        }\n        this._throttled = undefined;\n        if (_trailing) {\n            this.send();\n        }\n    }\n    notifyNext() {\n        this.throttlingDone();\n    }\n    notifyComplete() {\n        this.throttlingDone();\n    }\n}\n//# sourceMappingURL=throttle.js.map","import { Subscriber } from '../Subscriber';\nimport { async } from '../scheduler/async';\nimport { defaultThrottleConfig } from './throttle';\nexport function throttleTime(duration, scheduler = async, config = defaultThrottleConfig) {\n    return (source) => source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));\n}\nclass ThrottleTimeOperator {\n    constructor(duration, scheduler, leading, trailing) {\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    call(subscriber, source) {\n        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));\n    }\n}\nclass ThrottleTimeSubscriber extends Subscriber {\n    constructor(destination, duration, scheduler, leading, trailing) {\n        super(destination);\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n        this._hasTrailingValue = false;\n        this._trailingValue = null;\n    }\n    _next(value) {\n        if (this.throttled) {\n            if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n        else {\n            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n            if (this.leading) {\n                this.destination.next(value);\n            }\n            else if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n    }\n    _complete() {\n        if (this._hasTrailingValue) {\n            this.destination.next(this._trailingValue);\n            this.destination.complete();\n        }\n        else {\n            this.destination.complete();\n        }\n    }\n    clearThrottle() {\n        const throttled = this.throttled;\n        if (throttled) {\n            if (this.trailing && this._hasTrailingValue) {\n                this.destination.next(this._trailingValue);\n                this._trailingValue = null;\n                this._hasTrailingValue = false;\n            }\n            throttled.unsubscribe();\n            this.remove(throttled);\n            this.throttled = null;\n        }\n    }\n}\nfunction dispatchNext(arg) {\n    const { subscriber } = arg;\n    subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, OnDestroy } from '@angular/core';\nimport { UploadQueueService } from '../upload-queue/upload-queue.service';\nimport { animationFrameScheduler, Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\n\n@Component({\n    selector: 'upload-progress-bar',\n    templateUrl: './upload-progress-bar.component.html',\n    styleUrls: ['./upload-progress-bar.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UploadProgressBarComponent implements OnDestroy {\n    @HostBinding('class.hidden') hidden = true;\n    private subscription: Subscription;\n    public progress: number;\n\n    constructor(\n        private el: ElementRef,\n        public uploadQueue: UploadQueueService,\n        private cd: ChangeDetectorRef,\n    ) {\n        this.subscription = this.uploadQueue.totalProgress()\n            // material progress bar animation lasts 250ms\n            .pipe(throttleTime(260, animationFrameScheduler, {leading: true, trailing: true}))\n            .subscribe(progress => {\n                this.progress = progress;\n                this.hidden = progress === 100 || this.uploadQueue.count$.value.pending === 0;\n                this.cd.markForCheck();\n            });\n    }\n\n    ngOnDestroy() {\n        this.subscription.unsubscribe();\n    }\n}\n\n","<mat-progress-bar mode=\"determinate\" [value]=\"progress\" color=\"accent\"></mat-progress-bar>\n","import { Directive, ElementRef, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { openUploadWindow } from '../utils/open-upload-window';\nimport { UploadInputConfig } from '../upload-input-config';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\n@Directive({\n    selector: '[uploadButton]'\n})\nexport class UploadButtonDirective implements OnInit {\n    @Input('uploadButton') config: UploadInputConfig = {};\n    @Output() filesSelected = new EventEmitter<UploadedFile[]>();\n\n    constructor(private el: ElementRef) {}\n\n    ngOnInit() {\n        this.el.nativeElement.addEventListener('click', e => {\n            e.preventDefault();\n            e.stopPropagation();\n\n            openUploadWindow(this.config).then(files => {\n                if (files && files.length) {\n                    this.filesSelected.emit(files);\n                }\n            });\n        });\n    }\n}\n","<image-or-icon *ngIf=\"src$ | async as src; else defaultBg\" [src]=\"src\" class=\"inherit-size\"></image-or-icon>\n<ng-template #defaultBg>\n    <image-or-icon *ngIf=\"defaultBackground\" [src]=\"defaultBackground\" class=\"inherit-size\"></image-or-icon>\n</ng-template>\n<div class=\"action-buttons\">\n    <ng-container *ngIf=\"compact && !(isDisabled$ | async)\">\n        <span [matMenuTriggerFor]=\"menu\"></span>\n        <button type=\"button\" mat-icon-button (click)=\"openUploadDialog()\" class=\"action-button\">\n            <mat-icon svgIcon=\"add-photo-alternate\"></mat-icon>\n        </button>\n        <mat-menu #menu=\"matMenu\">\n            <button type=\"button\" mat-menu-item [uploadButton]=\"uploadInputConfig\" (filesSelected)=\"uploadImage($event)\">{{buttonText | trans}}</button>\n            <button type=\"button\" mat-menu-item (click)=\"deleteUpload()\" trans>Remove</button>\n        </mat-menu>\n    </ng-container>\n\n    <ng-container *ngIf=\"!compact && !(isDisabled$ | async)\">\n        <button type=\"button\" class=\"action-button\" mat-stroked-button color=\"accent\" [uploadButton]=\"uploadInputConfig\" (filesSelected)=\"uploadImage($event)\">{{buttonText | trans}}</button>\n        <button type=\"button\" class=\"action-button delete-button\" mat-icon-button *ngIf=\"src$ | async\" (click)=\"deleteUpload()\">\n            <mat-icon svgIcon=\"delete\"></mat-icon>\n        </button>\n    </ng-container>\n</div>\n<upload-progress-bar></upload-progress-bar>\n","import {Component, EventEmitter, HostBinding, Input, Output, ViewChild} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {BehaviorSubject} from 'rxjs';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {UploadInputConfig, UploadInputTypes} from '@common/uploads/upload-input-config';\nimport {AppearanceImageUploadValidator} from '@common/admin/appearance/appearance-image-input/appearance-image-upload-validator';\nimport {UploadUri} from '@common/uploads/types/upload-uri.enum';\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\nimport {UploadsApiService} from '@common/uploads/uploads-api.service';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {MatMenuTrigger} from '@angular/material/menu';\n\n@Component({\n    selector: 'upload-image-control',\n    templateUrl: './upload-image-control.component.html',\n    styleUrls: ['./upload-image-control.component.scss'],\n    providers: [UploadQueueService, {\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: UploadImageControlComponent,\n        multi: true,\n    }]\n})\nexport class UploadImageControlComponent implements ControlValueAccessor {\n    @Output() fileDeleted = new EventEmitter();\n    @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;\n    @Input() defaultBackground: string;\n    @Input() buttonText = 'Upload image';\n    @Input() uploadConfig: UploadApiConfig = {};\n    @Input() diskPrefix: string;\n    @Input() @HostBinding('class.compact') compact = false;\n    public uploadInputConfig: UploadInputConfig = {multiple: false, types: [UploadInputTypes.image]};\n    public isDisabled$ = new BehaviorSubject<boolean>(false);\n    public src$ = new BehaviorSubject<string>(null);\n    private propagateChange: Function;\n\n    constructor(\n        private uploadQueue: UploadQueueService,\n        private imageValidator: AppearanceImageUploadValidator,\n        private uploadsApi: UploadsApiService,\n        private http: AppHttpClient,\n    ) {}\n\n    public writeValue(value: string) {\n        this.src$.next(value);\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n\n    public setDisabledState(isDisabled: boolean) {\n        this.isDisabled$.next(isDisabled);\n    }\n\n    public uploadImage(files: UploadedFile[]) {\n        const config = {...this.defaultUploadConfig(), ...this.uploadConfig};\n        this.uploadQueue.start(files, config)\n            .subscribe(response => {\n                this.src$.next(response.fileEntry.url);\n                this.propagateChange(response.fileEntry.url);\n            });\n    }\n\n    public deleteUpload() {\n        const params = {paths: [this.src$.value], deleteForever: true};\n        const request = this.uploadConfig && this.uploadConfig.uri ?\n            this.http.delete(this.uploadConfig.uri, params) :\n            this.uploadsApi.delete(params);\n\n        request.subscribe(() => {\n            this.src$.next(null);\n            this.propagateChange(null);\n            this.fileDeleted.emit();\n        });\n    }\n\n    private defaultUploadConfig(): UploadApiConfig {\n        return {\n            httpParams: {diskPrefix: this.diskPrefix || 'common_media'},\n            uri: UploadUri.Image,\n            validator: this.imageValidator,\n        };\n    }\n\n    public openUploadDialog() {\n        if (this.src$.value) {\n            this.menuTrigger.toggleMenu();\n        } else {\n            openUploadWindow(this.uploadInputConfig).then(files => {\n                this.uploadImage(files);\n            });\n        }\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {UploadButtonDirective} from './directives/upload-button.directive';\nimport {UploadDropzoneDirective} from './directives/upload-dropzone.directive';\nimport {UploadProgressBarComponent} from './upload-progress-bar/upload-progress-bar.component';\n\n@NgModule({\n    imports: [\n        CommonModule,\n\n        // material\n        MatButtonModule,\n        MatProgressBarModule,\n        MatIconModule,\n    ],\n    declarations: [\n        UploadDropzoneDirective,\n        UploadButtonDirective,\n        UploadProgressBarComponent,\n    ],\n    exports: [\n        UploadDropzoneDirective,\n        UploadButtonDirective,\n        UploadProgressBarComponent,\n    ],\n})\nexport class UploadsModule {\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {UploadImageControlComponent} from './upload-image-control.component';\nimport {UploadsModule} from '@common/uploads/uploads.module';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport {ImageOrIconModule} from '@common/core/ui/image-or-icon/image-or-icon.module';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {MatMenuModule} from '@angular/material/menu';\n\n@NgModule({\n    declarations: [UploadImageControlComponent],\n    imports: [\n        CommonModule,\n        UploadsModule,\n        ImageOrIconModule,\n        TranslationsModule,\n\n        // material\n        MatProgressBarModule,\n        MatIconModule,\n        MatButtonModule,\n        MatMenuModule,\n    ],\n    exports: [\n      UploadImageControlComponent,\n    ]\n})\nexport class UploadImageControlModule {\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    OnDestroy,\n    OnInit,\n} from '@angular/core';\nimport {BreakpointsService} from '@common/core/ui/breakpoints.service';\nimport {BehaviorSubject, Subject} from 'rxjs';\nimport {LocalStorage} from '@common/core/services/local-storage.service';\nimport {Settings} from '@common/core/config/settings.service';\nimport { filter, skip, take, takeUntil } from 'rxjs/operators';\nimport {NavigationEnd, Router} from '@angular/router';\n\n@Component({\n    selector: 'sidenav',\n    templateUrl: './sidenav.component.html',\n    styleUrls: ['./sidenav.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidenavComponent implements OnInit, OnDestroy {\n    navIsOpen$ = new BehaviorSubject<boolean>(false);\n    isCompact$ = new BehaviorSubject<boolean>(false);\n    onDestroy$ = new Subject();\n\n    constructor(\n        public breakpoints: BreakpointsService,\n        private localStorage: LocalStorage,\n        private settings: Settings,\n        private el: ElementRef<HTMLElement>,\n        private router: Router\n    ) {}\n\n    ngOnInit() {\n        this.navIsOpen$.next(!this.breakpoints.isMobile$.value);\n\n        // set navbar width using css variables\n        this.isCompact$\n            .pipe(takeUntil(this.onDestroy$))\n            .subscribe(isCompact => {\n                if (isCompact) {\n                    this.el.nativeElement.style.setProperty(\n                        '--nav-width',\n                        '80px'\n                    );\n                } else {\n                    this.el.nativeElement.style.removeProperty('--nav-width');\n                }\n            });\n\n        // only enable transitions for subsequent opens so there's no initial flash\n        this.navIsOpen$.pipe(skip(1), take(1)).subscribe(() => {\n            this.el.nativeElement.classList.add('enable-transitions');\n        });\n\n        // toggle \"nav-closed\" class on host\n        this.navIsOpen$.pipe(takeUntil(this.onDestroy$)).subscribe(isOpen => {\n            if (isOpen) {\n                this.el.nativeElement.classList.remove('nav-closed');\n            } else {\n                this.el.nativeElement.classList.add('nav-closed');\n            }\n        });\n\n        // close left column when navigating between routes pages on mobile\n        this.router.events\n            .pipe(\n                filter(e => e instanceof NavigationEnd),\n                takeUntil(this.onDestroy$)\n            )\n            .subscribe(() => {\n                this.navIsOpen$.next(!this.breakpoints.isMobile$.value);\n            });\n    }\n\n    ngOnDestroy() {\n        this.onDestroy$.next();\n    }\n\n    toggleSidebarMode() {\n        if (this.breakpoints.isMobile$.value) {\n            this.navIsOpen$.next(!this.navIsOpen$.value);\n        } else {\n            this.isCompact$.next(!this.isCompact$.value);\n            this.localStorage.set(\n                this.storageSelector(),\n                this.isCompact$.value\n            );\n        }\n    }\n\n    private storageSelector() {\n        return `${this.settings.get('branding.site_name')}.sidebarCompact`;\n    }\n}\n","<ng-content></ng-content>\n<div class=\"backdrop\" [class.visible]=\"navIsOpen$ | async\" (click)=\"navIsOpen$.next(false)\"></div>\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SidenavComponent} from './sidenav.component';\n\n@NgModule({\n    declarations: [SidenavComponent],\n    imports: [CommonModule],\n    exports: [SidenavComponent],\n})\nexport class SidenavModule {}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatCheckboxModule} from '@angular/material/checkbox';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {MatSnackBarModule} from '@angular/material/snack-bar';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {TextEditorComponent} from './text-editor.component';\nimport {MatIconModule} from '@angular/material/icon';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n        TranslationsModule,\n\n        // material\n        MatButtonModule,\n        MatSnackBarModule,\n        MatCheckboxModule,\n        MatTooltipModule,\n        MatDialogModule,\n        MatMenuModule,\n        MatIconModule,\n    ],\n    declarations: [\n        TextEditorComponent,\n    ],\n    exports: [\n        TextEditorComponent,\n    ],\n})\nexport class TextEditorModule { }\n","export enum UploadUri {\n    Image = 'uploads/images',\n}\n","import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\nimport { randomString } from '../../core/utils/random-string';\nimport { UploadedFile } from '../uploaded-file';\nimport { FileEntry } from '../types/file-entry';\nimport { UploadFileResponse } from '@common/uploads/uploads-api.service';\n\nexport interface UploadQueueItemProgress {\n    percentage?: number;\n    speed?: string;\n    eta?: string;\n    totalBytes?: number;\n    completedBytes?: number;\n}\n\nexport class UploadQueueItem {\n    id: string;\n    canceled$: Subject<boolean> = new Subject();\n    processing$ = new BehaviorSubject<boolean>(false);\n\n    // file info (static)\n    uploadedFile: UploadedFile;\n\n    // backend response once file is uploaded\n    uploadedResponse$ = new ReplaySubject<UploadFileResponse>(1);\n\n    // uploaded file entry (only available on completed uploads)\n    fileEntry: FileEntry;\n\n    // upload progress information (will change)\n    progress$ = new BehaviorSubject<UploadQueueItemProgress>({percentage: 0});\n\n    error$ = new BehaviorSubject<string>(null);\n\n    // custom data that can be attached to queue item\n    public customData: object = {};\n\n    get completed(): boolean {\n        return !this.processing$.value && this.progress$.value.percentage === 100;\n    }\n\n    get inProgress(): boolean {\n        return !this.error$.value && !this.completed;\n    }\n\n    constructor(file: UploadedFile, queueId?: string) {\n        this.uploadedFile = file;\n        this.id = queueId || randomString();\n    }\n\n    public cancel() {\n        // cancelling before finalizing might cause infinite loop\n        this.canceled$.next(true);\n        this.finalize();\n    }\n\n    public complete() {\n        this.setProgress({percentage: 100, eta: null});\n        this.finalize();\n    }\n\n    public finalize() {\n        this.uploadedResponse$.complete();\n        this.canceled$.complete();\n        this.progress$.complete();\n    }\n\n    public finishProcessing() {\n        this.processing$.next(false);\n        this.processing$.complete();\n    }\n\n    public addError(message: string) {\n        this.error$.next(message);\n    }\n\n    public setProgress(data: Partial<UploadQueueItemProgress>) {\n        this.progress$.next({\n            ...this.progress$.value,\n            ...data,\n        });\n    }\n}\n","import { UploadedFile } from '../../uploaded-file';\nimport { UploadValidation } from './upload-validation';\nimport { Translations } from '../../../core/translations/translations.service';\n\nexport class AllowedExtensionsValidation extends UploadValidation {\n    constructor(\n        protected params: {extensions: string[]},\n        protected i18n: Translations\n    ) {\n        super();\n\n        this.errorMessage = this.i18n.t(\n            'Only these file types are allowed: :extensions',\n            {extensions: this.params.extensions.join(', ')}\n        );\n    }\n\n    public fails(file: UploadedFile) {\n        return ! this.params.extensions.some(extension => {\n            return extension.toLowerCase() === file.extension.toLowerCase();\n        });\n    }\n}\n","import { UploadedFile } from '../../uploaded-file';\nimport { UploadValidation } from './upload-validation';\nimport {Translations} from '@common/core/translations/translations.service';\n\nexport class BlockedExtensionsValidation extends UploadValidation {\n    constructor(\n        protected params: {extensions: string[]},\n        protected i18n: Translations\n    ) {\n        super();\n\n        this.errorMessage = this.i18n.t(\n            'These file types are not allowed: :extensions',\n            {extensions: this.params.extensions.join(', ')}\n        );\n    }\n\n    public fails(file: UploadedFile) {\n        return this.params.extensions.some(extension => {\n            return extension === file.extension;\n        });\n    }\n}\n","import { Injectable } from '@angular/core';\nimport {UploadValidator} from './upload-validator';\nimport {FileSizeValidation} from './validations/file-size-validation';\nimport {AllowedExtensionsValidation} from './validations/allowed-extensions-validation';\nimport {BlockedExtensionsValidation} from './validations/blocked-extensions-validation';\nimport {convertToBytes} from '../../core/utils/convertToBytes';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DefaultUploadValidator extends UploadValidator {\n    protected readonly DEFAULT_MAX_FILE_SIZE_MB = 8;\n    public showToast = true;\n\n    protected initValidations() {\n        this.validations.push(\n            new FileSizeValidation(\n                {maxSize: this.getMaxFileSize()},\n                this.i18n\n            )\n        );\n\n        const allowedExtensions = this.getAllowedExtensions(),\n            blockedExtensions = this.getBlockedExtensions();\n\n        if (allowedExtensions && allowedExtensions.length) {\n            this.validations.push(new AllowedExtensionsValidation(\n                {extensions: allowedExtensions}, this.i18n\n            ));\n        }\n\n        if (blockedExtensions && blockedExtensions.length) {\n            this.validations.push(new BlockedExtensionsValidation(\n                {extensions: blockedExtensions}, this.i18n\n            ));\n        }\n    }\n\n    protected getMaxFileSize(): number {\n        return this.settings.get(\n            'uploads.max_size',\n            convertToBytes(this.DEFAULT_MAX_FILE_SIZE_MB, 'MB')\n        );\n    }\n\n    protected getAllowedExtensions() {\n        return this.settings.getJson('uploads.allowed_extensions');\n    }\n\n    protected getBlockedExtensions() {\n        return this.settings.getJson('uploads.blocked_extensions');\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {UploadQueueItem} from './upload-queue-item';\nimport {BehaviorSubject, EMPTY, from, ReplaySubject, Subject, throwError} from 'rxjs';\nimport {catchError, filter, map, mergeMap, takeUntil} from 'rxjs/operators';\nimport {UploadedFile} from '../uploaded-file';\nimport {UploadCompletedEvent, UploadEvent, UploadEventTypes, UploadProgressEvent} from '../utils/upload-progress-event';\nimport {UploadFileResponse, UploadsApiService} from '../uploads-api.service';\nimport {FileEntry} from '../types/file-entry';\nimport {UploadValidator} from '../validation/upload-validator';\nimport {BackendErrorResponse} from '../../core/types/backend-error-response';\nimport {DefaultUploadValidator} from '../validation/default-upload-validator';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {HttpErrors, UPLOAD_FAIL_LEARN_MORE_LINK} from '@common/core/http/errors/http-errors.enum';\nimport {UploadApiConfig} from '@common/uploads/types/upload-api-config';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Settings} from '@common/core/config/settings.service';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class UploadQueueService {\n    public uploads$ = new BehaviorSubject<UploadQueueItem[]>([]);\n    public totalProgress$ = new ReplaySubject<number>(1);\n    public uploadsAdded$ = new Subject<UploadQueueItem[]>();\n    public count$ = new BehaviorSubject<{pending: number, completed: number}>({pending: 0, completed: 0});\n\n    constructor(\n        private api: UploadsApiService,\n        private defaultValidator: DefaultUploadValidator,\n        private toast: Toast,\n        private currentUser: CurrentUser,\n        private settings: Settings,\n    ) {}\n\n    public isEmpty(): boolean {\n        return !this.uploads$.value.length;\n    }\n\n    public getAllCompleted(): FileEntry[] {\n        return this.uploads$.value\n            .filter(queueItem => queueItem.completed)\n            .map(queueItem => queueItem.fileEntry);\n    }\n\n    public updateTotalProgress() {\n        const progress = this.uploads$.value.map(upload => upload.progress$.value.percentage || 0);\n        this.totalProgress$.next(progress.reduce((p, c) => p + c, 0) / progress.length);\n    }\n\n    public totalProgress() {\n        return this.totalProgress$.asObservable();\n    }\n\n    public start(files: UploadedFile[]|{[key: string]: UploadedFile}, config: UploadApiConfig = {}): BackendResponse<UploadFileResponse> {\n        const validator = config.validator || this.defaultValidator;\n        let uploadQueueItems = [] as UploadQueueItem[];\n\n        // push new uploads onto existing queue\n        if (Array.isArray(files)) {\n            uploadQueueItems = this.transformUploads(files, validator);\n            this.uploads$.next(this.uploads$.value.concat(uploadQueueItems));\n            this.uploadsAdded$.next(uploadQueueItems);\n\n        // replace existing uploads in the queue with new upload by specified upload ID\n        } else {\n            const replacements = this.uploads$.value.map(queueItem => {\n                if (files[queueItem.id]) {\n                    const transformed = this.transformUploads([files[queueItem.id]], validator, queueItem.id)[0];\n                    uploadQueueItems.push(transformed);\n                    return transformed;\n                } else {\n                    return queueItem;\n                }\n            });\n            this.uploads$.next(replacements);\n        }\n\n        this.updateCount();\n\n        return from(uploadQueueItems.filter(u => !u.error$.value))\n            .pipe(\n                mergeMap(uploadQueueItem => {\n                    return this.api.upload(uploadQueueItem.uploadedFile, config).pipe(\n                        catchError((errResponse: BackendErrorResponse) => {\n                            this.handleUploadFailure(errResponse, uploadQueueItem, validator);\n                            // if one item in the queue fails, either continue uploading other items\n                            // or immediately stop uploading and bubble up error to subscribers\n                            return config.bubbleError ? throwError(errResponse) : EMPTY;\n                        }),\n                        takeUntil(uploadQueueItem.canceled$),\n                        map(response => {\n                            this.handleUploadEvent(response, uploadQueueItem, config.willProcessFiles);\n                            // assign queue item ID to upload completed response so\n                            // file entry can be matched to specific upload queue item\n                            if (response.name === UploadEventTypes.COMPLETED) {\n                                response.body.queueItemId = uploadQueueItem.id;\n                            }\n                            return response;\n                        }),\n                    );\n                }, 1),\n                filter(e => e.name === UploadEventTypes.COMPLETED),\n                map((e: UploadCompletedEvent) => e.body)\n            );\n    }\n\n    public updateProgress(id: string, e: UploadProgressEvent) {\n        const queueItem = this.find(id);\n        if ( ! queueItem) return;\n\n        queueItem.setProgress({\n            eta: e.eta,\n            speed: e.speed,\n            percentage: e.progress,\n            totalBytes: e.totalBytes,\n            completedBytes: e.completedBytes,\n        });\n\n        this.updateTotalProgress();\n    }\n\n    public completeUpload(id: string, response: UploadFileResponse) {\n        const queueItem = this.find(id);\n        if ( ! queueItem) return;\n\n        queueItem.uploadedResponse$.next(response);\n        queueItem.fileEntry = response.fileEntry;\n        queueItem.complete();\n        this.updateTotalProgress();\n    }\n\n    public errorUpload(id: string, message?: string) {\n        this.find(id).addError(message);\n    }\n\n    public reset() {\n        this.uploads$.value.forEach(u => u.cancel());\n        this.uploads$.next([]);\n    }\n\n    public remove(id: string) {\n        const i = this.uploads$.value.findIndex(u => u.id === id),\n            upload = this.uploads$.value[i];\n        upload.completed ? upload.finalize() : upload.cancel();\n        this.uploads$.value.splice(i, 1);\n        this.uploads$.next(this.uploads$.value);\n    }\n\n    public find(id: string): UploadQueueItem {\n        return this.uploads$.value.find(u => u.id === id);\n    }\n\n    /**\n     * Transform specified files into upload queue items.\n     */\n    protected transformUploads(files: UploadedFile[], validator: UploadValidator, queueId?: string) {\n        return files.map(file => {\n            const activeUpload = new UploadQueueItem(file, queueId);\n\n            // validate upload\n            if (validator) {\n                const result = validator.validate(file);\n                if (result.failed) activeUpload.addError(result.errorMessage);\n            }\n\n            return activeUpload;\n        });\n    }\n\n    protected handleUploadEvent(event: UploadEvent, upload: UploadQueueItem, willProcessFiles = false) {\n        if (event.name === UploadEventTypes.PROGRESS) {\n            // upload is considered complete when progress equals 100\n            // but file processing for large files might take some time\n            // after file is fully uploaded so we should only set\n            // progress as 100 on final completed response\n            if (event.progress === 100) {\n                // TODO: implement processing functionality for chunked upploading\n                event = {...event, progress: 99};\n                if (willProcessFiles) {\n                    upload.processing$.next(true);\n                }\n            }\n            this.updateProgress(upload.id, event);\n        } else if (event.name === UploadEventTypes.COMPLETED) {\n            this.completeUpload(upload.id, event.body);\n            this.updateCount();\n        }\n    }\n\n    protected handleUploadFailure(response: BackendErrorResponse, upload: UploadQueueItem, validator: UploadValidator) {\n        let msg = response?.errors?.file,\n            showLearnMoreButton = null;\n        if ( ! msg) {\n            msg = HttpErrors.DefaultUpload;\n            showLearnMoreButton = this.currentUser.isAdmin() && !this.settings.get('site.hide_docs_buttons');\n        }\n\n        this.errorUpload(upload.id, msg);\n        this.updateCount();\n        this.updateTotalProgress();\n\n        if (validator.showToast) {\n            this.toast.open(msg, {action: showLearnMoreButton ? 'Learn More' : null})\n                .onAction()\n                .subscribe(() => {\n                    window.open(UPLOAD_FAIL_LEARN_MORE_LINK);\n                });\n        }\n    }\n\n    private updateCount() {\n        const pending = this.uploads$.value.filter(u => u.inProgress).length;\n        this.count$.next({pending, completed: this.uploads$.value.length - pending});\n    }\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title>\n        <span trans *ngIf=\"!data.workspace\">Create Workspace</span>\n        <span trans *ngIf=\"data.workspace\">Update Workspace</span>\n    </h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form (ngSubmit)=\"confirm()\" ngNativeValidate [formGroup]=\"form\" *ngIf=\"errors$ | async as errors\">\n    <mat-dialog-content class=\"many-inputs\">\n        <div class=\"input-container name-container\">\n            <label for=\"crupdate-workspace-name\" trans>Name</label>\n            <input type=\"text\" id=\"crupdate-workspace-name\" formControlName=\"name\" required minlength=\"3\">\n            <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n        </div>\n    </mat-dialog-content>\n\n    <mat-dialog-actions>\n        <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n        <button type=\"submit\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>{{data.workspace ? 'Update' : 'Create'}}</button>\n    </mat-dialog-actions>\n</form>\n","import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { finalize } from 'rxjs/operators';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\nimport { Workspace } from '../types/workspace';\nimport { WorkspacesService } from '../workspaces.service';\n\nexport interface CrupdateWorkspaceModalData {\n    workspace?: Workspace;\n}\n\n@Component({\n    selector: 'crupdate-workspace-modal',\n    templateUrl: './crupdate-workspace-modal.component.html',\n    styleUrls: ['./crupdate-workspace-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CrupdateWorkspaceModalComponent {\n    public loading$ = new BehaviorSubject(false);\n    public errors$ = new BehaviorSubject<{name?: string}>({});\n    public form = new FormGroup({\n        name: new FormControl(),\n    });\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateWorkspaceModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateWorkspaceModalData,\n        private workspaces: WorkspacesService,\n        private toast: Toast,\n    ) {\n        if (data.workspace) {\n            this.form.patchValue(data.workspace);\n        }\n    }\n\n    public confirm() {\n        this.loading$.next(true);\n        const request = this.data.workspace ?\n            this.workspaces.update(this.data.workspace.id, this.form.value) :\n            this.workspaces.create(this.form.value);\n        request.pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(response => {\n                this.toast.open(this.data.workspace ? 'Workspace updated.' : 'Workspace created.');\n                this.close(response.workspace);\n            }, (errResponse: BackendErrorResponse) => this.errors$.next(errResponse.errors));\n    }\n\n    public close(workspace?: Workspace) {\n        this.dialogRef.close(workspace);\n    }\n}\n","import {ConfirmModalData} from '@common/core/ui/confirm-modal/confirm-modal.component';\n\nexport const LEAVE_WORKSPACE_CONFIRMATION: ConfirmModalData = {\n    title: `Leave Workspace`,\n    body:  `Are you sure you want to leave this workspace?`,\n    bodyBold: `All resources you've created in the workspace will be transferred to workspace owner.`,\n    ok: 'Leave'\n};\n","export enum WorkspaceMessages {\n    LEFT_WORKSPACE = 'You have left the workspace.',\n    MEMBER_DELETED = 'Member Deleted.',\n    INVITES_SENT = 'Invites Sent.',\n    INVITE_RESENT = 'Resent invite.',\n    ROLE_ASSIGNED = 'Role Assigned.',\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Manage workspace members</h2>\n    <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<mat-dialog-content style=\"overflow: hidden\" #container>\n    <div class=\"invite-container\" *ngIf=\"canInvite\" @fadeIn>\n        <div class=\"input-container\">\n            <label for=\"workspace-emails-input\" trans>Invite by email</label>\n            <div class=\"input-with-action\">\n                <chip-input id=\"workspace-emails-input\" placeholder=\"Email addresses\" [emailsInput]=\"true\" [formControl]=\"peopleToInvite\"></chip-input>\n                <button\n                    type=\"button\"\n                    class=\"add-tags-button\"\n                    mat-flat-button\n                    color=\"accent\"\n                    (click)=\"invitePeople()\"\n                    [disabled]=\"(inviting$ | async) || !(peopleToInvite.valueChanges | async)?.length\"\n                    trans\n                >Invite\n                </button>\n            </div>\n        </div>\n        <mat-progress-bar mode=\"indeterminate\" color=\"accent\" *ngIf=\"inviting$ | async\"></mat-progress-bar>\n    </div>\n\n    <div class=\"header\">\n        <mat-icon svgIcon=\"people\"></mat-icon>\n        <span class=\"text\" [transValues]=\"{workspace: data.workspace.name}\" trans>Members of :workspace</span>\n    </div>\n\n    <div class=\"animation-container\">\n        <ul class=\"member-list unstyled-list\" *ngIf=\"loadingMembers$ | async\" @fadeOut>\n            <li class=\"member-list-item\" *ngFor=\"let i of [1, 2, 3]\">\n                <skeleton variant=\"avatar\"></skeleton>\n                <div class=\"details\">\n                    <skeleton></skeleton>\n                    <skeleton></skeleton>\n                </div>\n            </li>\n        </ul>\n\n        <ul class=\"member-list unstyled-list\">\n            <li *ngFor=\"let member of members$ | async\" class=\"member-list-item\" @fadeIn (@fadeIn.done)=\"container.style.overflow = 'auto'\">\n                <img [src]=\"member.avatar\" alt=\"\">\n                <div class=\"details\">\n                    <div class=\"email\">\n                        <span>{{member.display_name}}</span>\n                        &ngsp;\n                        <span class=\"strong\"\n                              *ngIf=\"currentUser.get('id') === member.id\" trans>(You)</span>\n                        <span *ngIf=\"member.model_type === 'invite'\">\n                        ·\n                        <span trans>Invited</span>\n                       <ng-container *ngIf=\"canInvite\">\n                            ·\n                            <button type=\"button\" class=\"no-style resend-invite-button\"\n                                    [disabled]=\"inviting$ | async\"\n                                    (click)=\"maybeResendInvite(member)\" trans>Resend Invite</button>\n                       </ng-container>\n                    </span>\n                    </div>\n                    <div class=\"invited_at\">{{member.email}}</div>\n                </div>\n                <div class=\"actions\">\n                    <button type=\"button\" mat-stroked-button class=\"role-trigger-button\"\n                            [class.not-clickable]=\"member.is_owner || !canEdit\"\n                            [matMenuTriggerFor]=\"selectRoleMenu\"\n                            [matMenuTriggerData]=\"{member: member}\">\n                        <span trans>{{member.role_name}}</span>\n                        <mat-icon svgIcon=\"keyboard-arrow-down\"\n                                  class=\"dropdown-icon\"></mat-icon>\n                    </button>\n                    <button type=\"button\" class=\"delete-member-button\"\n                            (click)=\"maybeDeleteMember(member)\"\n                            *ngIf=\"member.is_owner || currentUser.get('id') !== member.id\"\n                            [class.visually-hidden]=\"member.is_owner || !canDelete\"\n                            mat-icon-button [disabled]=\"deleting$ | async\">\n                        <mat-icon svgIcon=\"close\"></mat-icon>\n                    </button>\n                    <button type=\"button\" class=\"delete-member-button\"\n                            [matTooltip]=\"'Leave workspace' | trans\"\n                            (click)=\"maybeLeaveWorkspace(member)\"\n                            *ngIf=\"!member.is_owner && currentUser.get('id') === member.id\"\n                            mat-icon-button [disabled]=\"deleting$ | async\">\n                        <mat-icon svgIcon=\"exit-to-app\"></mat-icon>\n                    </button>\n                </div>\n            </li>\n        </ul>\n    </div>\n</mat-dialog-content>\n\n<mat-menu #selectRoleMenu=\"matMenu\">\n    <ng-template matMenuContent let-member=\"member\">\n        <div class=\"multiline-mat-menu-item with-icon\"\n             [class.active]=\"member.role_id === role.id\" mat-menu-item\n             (click)=\"changeRole(member, role)\"\n             *ngFor=\"let role of workspaceRoles$ | async\" trans>\n            <mat-icon svgIcon=\"check\"\n                      [class.visually-hidden]=\"member.role_id !== role.id\"></mat-icon>\n            <div class=\"menu-item-content\">\n                <div class=\"title\" trans>{{role.name}}</div>\n                <div class=\"description\" trans>{{role.description}}</div>\n            </div>\n        </div>\n    </ng-template>\n</mat-menu>\n\n\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    Inject,\n    OnInit,\n} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormControl} from '@angular/forms';\nimport {Role} from '@common/core/types/models/Role';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {WorkspacesService} from '../workspaces.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ValueLists} from '@common/core/services/value-lists.service';\nimport {Workspace} from '../types/workspace';\nimport {WorkspaceMember} from '../types/workspace-member';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {finalize} from 'rxjs/operators';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {WorkspaceMessages} from '../workspace-messages';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {LEAVE_WORKSPACE_CONFIRMATION} from '../leave-workspace-confirmation';\nimport {SKELETON_ANIMATIONS} from '@common/core/ui/skeleton/skeleton-animations';\n\nexport interface ManageWorkspaceMembersModalData {\n    workspace?: Workspace;\n}\n\ntype MemberOrInvite = WorkspaceMember | WorkspaceInvite;\n\n@Component({\n    selector: 'manage-workspace-members-modal',\n    templateUrl: './manage-workspace-members-modal.component.html',\n    styleUrls: ['./manage-workspace-members-modal.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: SKELETON_ANIMATIONS,\n})\nexport class ManageWorkspaceMembersModalComponent implements OnInit {\n    public inviting$ = new BehaviorSubject(false);\n    public deleting$ = new BehaviorSubject(false);\n    public loadingMembers$ = new BehaviorSubject(false);\n    public workspaceRoles$ = new BehaviorSubject<Role[]>([]);\n    public members$ = new BehaviorSubject<\n        (WorkspaceMember | WorkspaceInvite)[]\n    >([]);\n    public peopleToInvite = new FormControl([]);\n\n    public canInvite = false;\n    public canEdit = false;\n    public canDelete = false;\n\n    constructor(\n        private dialogRef: MatDialogRef<ManageWorkspaceMembersModalComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: ManageWorkspaceMembersModalData,\n        private workspaces: WorkspacesService,\n        private toast: Toast,\n        private valueLists: ValueLists,\n        public currentUser: CurrentUser,\n        private modal: Modal\n    ) {}\n\n    ngOnInit() {\n        this.loadingMembers$.next(true);\n        this.valueLists.get(['workspaceRoles']).subscribe(response => {\n            this.workspaceRoles$.next(response.workspaceRoles);\n        });\n        this.workspaces\n            .get(this.data.workspace.id)\n            .pipe(finalize(() => this.loadingMembers$.next(false)))\n            .subscribe(response => {\n                this.members$.next([\n                    ...response.workspace.invites,\n                    ...response.workspace.members,\n                ]);\n                this.setCurrentUserPermissions();\n            });\n    }\n\n    public close(workspace?: Workspace) {\n        this.dialogRef.close(workspace);\n    }\n\n    public invitePeople() {\n        const emails = this.peopleToInvite.value.filter(email => {\n            return !this.members$.value.find(m => m.email === email);\n        });\n        if (!emails.length) {\n            this.peopleToInvite.reset();\n            this.toast.open('All invited people are already members.');\n            return;\n        }\n        const payload = {\n            emails,\n            roleId: (\n                this.workspaceRoles$.value.find(r => r.default) ||\n                this.workspaceRoles$.value[0]\n            ).id,\n        };\n        this.inviting$.next(true);\n        this.workspaces\n            .invitePeople(this.data.workspace.id, payload)\n            .pipe(finalize(() => this.inviting$.next(false)))\n            .subscribe(response => {\n                this.members$.next([\n                    ...this.members$.value,\n                    ...response.invites,\n                ]);\n                this.peopleToInvite.reset();\n                this.toast.open(WorkspaceMessages.INVITES_SENT);\n            });\n    }\n\n    public resendInvite(invite: WorkspaceInvite) {\n        this.inviting$.next(true);\n        this.workspaces\n            .resendInvite(this.data.workspace.id, invite.id)\n            .pipe(finalize(() => this.inviting$.next(false)))\n            .subscribe(() => {\n                this.toast.open(WorkspaceMessages.INVITE_RESENT);\n            });\n    }\n\n    public changeRole(member: WorkspaceMember | WorkspaceInvite, role: Role) {\n        this.workspaces\n            .changeRole(this.data.workspace.id, member, role.id)\n            .subscribe(() => {\n                this.toast.open(WorkspaceMessages.ROLE_ASSIGNED);\n                const members = [...this.members$.value];\n                const i = members.findIndex(m => m.id === member.id);\n                members[i].role_name = role.name;\n                members[i].role_id = role.id;\n                this.members$.next(members);\n            });\n    }\n\n    public deleteMember(member: MemberOrInvite) {\n        this.deleting$.next(true);\n        const request =\n            member.model_type === 'member'\n                ? this.workspaces.deleteMember(\n                      this.data.workspace.id,\n                      member.id\n                  )\n                : this.workspaces.deleteInvite(member.id);\n        request\n            .pipe(finalize(() => this.deleting$.next(false)))\n            .subscribe(() => {\n                const value = [...this.members$.value];\n                const i = value.findIndex(\n                    (m: MemberOrInvite) =>\n                        member.id && m.model_type === member.model_type\n                );\n                value.splice(i, 1);\n                this.members$.next(value);\n                if (member.id === this.currentUser.get('id')) {\n                    this.close();\n                    this.toast.open(WorkspaceMessages.LEFT_WORKSPACE);\n                } else {\n                    this.toast.open(WorkspaceMessages.MEMBER_DELETED);\n                }\n            });\n    }\n\n    public maybeDeleteMember(member: MemberOrInvite) {\n        this.modal\n            .show(ConfirmModalComponent, {\n                title: `Delete Member`,\n                body: `Are you sure you want to delete this member?`,\n                bodyBold:\n                    'All workspace resources created by this member will be transferred to workspace owner.',\n                ok: 'Delete',\n            })\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (confirmed) {\n                    this.deleteMember(member);\n                }\n            });\n    }\n\n    public maybeResendInvite(invite: WorkspaceInvite) {\n        this.modal\n            .show(ConfirmModalComponent, {\n                title: `Resend Invite`,\n                body: `Are you sure you want to send this invite again?`,\n                ok: 'Resend',\n            })\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (confirmed) {\n                    this.resendInvite(invite);\n                }\n            });\n    }\n\n    public maybeLeaveWorkspace(member: WorkspaceMember) {\n        this.modal\n            .show(ConfirmModalComponent, LEAVE_WORKSPACE_CONFIRMATION)\n            .afterClosed()\n            .subscribe(confirmed => {\n                if (confirmed) {\n                    this.deleteMember(member);\n                }\n            });\n    }\n\n    private setCurrentUserPermissions() {\n        const member = this.members$.value.find(\n            m => m.id === this.currentUser.get('id')\n        ) as WorkspaceMember;\n        this.canInvite =\n            member.is_owner ||\n            !!member.permissions.find(\n                p => p.name === 'workspace_members.invite'\n            );\n        this.canEdit =\n            member.is_owner ||\n            !!member.permissions.find(\n                p => p.name === 'workspace_members.update'\n            );\n        this.canDelete =\n            member.is_owner ||\n            !!member.permissions.find(\n                p => p.name === 'workspace_members.delete'\n            );\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CrupdateWorkspaceModalComponent } from './crupdate-workspace-modal/crupdate-workspace-modal.component';\nimport { ManageWorkspaceMembersModalComponent } from './manage-workspace-members-modal/manage-workspace-members-modal.component';\nimport { WorkspaceIndexComponent } from './workspace-index/workspace-index.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { TranslationsModule } from '../core/translations/translations.module';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { DatatableModule } from '../datatable/datatable.module';\nimport { InfoPopoverModule } from '../core/ui/info-popover/info-popover.module';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormatPipesModule } from '../core/ui/format-pipes/format-pipes.module';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { SkeletonModule } from '../core/ui/skeleton/skeleton.module';\nimport { ChipsModule } from '../core/ui/chips/chips.module';\nimport { MatMenuModule } from '@angular/material/menu';\n\n@NgModule({\n  declarations: [\n      CrupdateWorkspaceModalComponent,\n      ManageWorkspaceMembersModalComponent,\n      WorkspaceIndexComponent,\n  ],\n  imports: [\n    CommonModule,\n      FormsModule,\n      ReactiveFormsModule,\n      TranslationsModule,\n      DatatableModule,\n      InfoPopoverModule,\n      FormatPipesModule,\n      SkeletonModule,\n      ChipsModule,\n\n      // material\n      MatIconModule,\n      MatButtonModule,\n      MatDialogModule,\n      MatRadioModule,\n      MatTooltipModule,\n      MatProgressBarModule,\n      MatMenuModule,\n  ],\n  exports: [\n    CrupdateWorkspaceModalComponent,\n    ManageWorkspaceMembersModalComponent,\n    WorkspaceIndexComponent,\n  ]\n})\nexport class WorkspaceModule {\n  static components = {\n    crupdateModal: CrupdateWorkspaceModalComponent,\n    manageMembers: ManageWorkspaceMembersModalComponent,\n  };\n}\n"]}