%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/graphicd/public_html/vebto/public/client/
Upload File :
Create Path :
Current File : /home/graphicd/public_html/vebto/public/client/936-es2015.4c349652cd92731bb447.js.map

{"version":3,"sources":["node_modules/@angular/material/__ivy_ngcc__/fesm2015/autocomplete.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/chips.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/form-field.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/slide-toggle.js","node_modules/fast-deep-equal/index.js","node_modules/lodash/_DataView.js","node_modules/lodash/_Hash.js","node_modules/lodash/_ListCache.js","node_modules/lodash/_Map.js","node_modules/lodash/_MapCache.js","node_modules/lodash/_Promise.js","node_modules/lodash/_Set.js","node_modules/lodash/_SetCache.js","node_modules/lodash/_Stack.js","node_modules/lodash/_Symbol.js","node_modules/lodash/_Uint8Array.js","node_modules/lodash/_WeakMap.js","node_modules/lodash/_arrayEach.js","node_modules/lodash/_arrayFilter.js","node_modules/lodash/_arrayIncludes.js","node_modules/lodash/_arrayIncludesWith.js","node_modules/lodash/_arrayLikeKeys.js","node_modules/lodash/_arrayMap.js","node_modules/lodash/_arrayPush.js","node_modules/lodash/_arraySome.js","node_modules/lodash/_assignValue.js","node_modules/lodash/_assocIndexOf.js","node_modules/lodash/_baseAssign.js","node_modules/lodash/_baseAssignIn.js","node_modules/lodash/_baseAssignValue.js","node_modules/lodash/_baseClone.js","node_modules/lodash/_baseCreate.js","node_modules/lodash/_baseFindIndex.js","node_modules/lodash/_baseGet.js","node_modules/lodash/_baseGetAllKeys.js","node_modules/lodash/_baseGetTag.js","node_modules/lodash/_baseHasIn.js","node_modules/lodash/_baseIndexOf.js","node_modules/lodash/_baseIsArguments.js","node_modules/lodash/_baseIsEqual.js","node_modules/lodash/_baseIsEqualDeep.js","node_modules/lodash/_baseIsMap.js","node_modules/lodash/_baseIsMatch.js","node_modules/lodash/_baseIsNaN.js","node_modules/lodash/_baseIsNative.js","node_modules/lodash/_baseIsSet.js","node_modules/lodash/_baseIsTypedArray.js","node_modules/lodash/_baseIteratee.js","node_modules/lodash/_baseKeys.js","node_modules/lodash/_baseKeysIn.js","node_modules/lodash/_baseMatches.js","node_modules/lodash/_baseMatchesProperty.js","node_modules/lodash/_baseProperty.js","node_modules/lodash/_basePropertyDeep.js","node_modules/lodash/_baseTimes.js","node_modules/lodash/_baseToString.js","node_modules/lodash/_baseUnary.js","node_modules/lodash/_baseUniq.js","node_modules/lodash/_cacheHas.js","node_modules/lodash/_castPath.js","node_modules/lodash/_cloneArrayBuffer.js","node_modules/lodash/_cloneBuffer.js","node_modules/lodash/_cloneDataView.js","node_modules/lodash/_cloneRegExp.js","node_modules/lodash/_cloneSymbol.js","node_modules/lodash/_cloneTypedArray.js","node_modules/lodash/_copyArray.js","node_modules/lodash/_copyObject.js","node_modules/lodash/_copySymbols.js","node_modules/lodash/_copySymbolsIn.js","node_modules/lodash/_coreJsData.js","node_modules/lodash/_createSet.js","node_modules/lodash/_defineProperty.js","node_modules/lodash/_equalArrays.js","node_modules/lodash/_equalByTag.js","node_modules/lodash/_equalObjects.js","node_modules/lodash/_freeGlobal.js","node_modules/lodash/_getAllKeys.js","node_modules/lodash/_getAllKeysIn.js","node_modules/lodash/_getMapData.js","node_modules/lodash/_getMatchData.js","node_modules/lodash/_getNative.js","node_modules/lodash/_getPrototype.js","node_modules/lodash/_getRawTag.js","node_modules/lodash/_getSymbols.js","node_modules/lodash/_getSymbolsIn.js","node_modules/lodash/_getTag.js","node_modules/lodash/_getValue.js","node_modules/lodash/_hasPath.js","node_modules/lodash/_hashClear.js","node_modules/lodash/_hashDelete.js","node_modules/lodash/_hashGet.js","node_modules/lodash/_hashHas.js","node_modules/lodash/_hashSet.js","node_modules/lodash/_initCloneArray.js","node_modules/lodash/_initCloneByTag.js","node_modules/lodash/_initCloneObject.js","node_modules/lodash/_isIndex.js","node_modules/lodash/_isKey.js","node_modules/lodash/_isKeyable.js","node_modules/lodash/_isMasked.js","node_modules/lodash/_isPrototype.js","node_modules/lodash/_isStrictComparable.js","node_modules/lodash/_listCacheClear.js","node_modules/lodash/_listCacheDelete.js","node_modules/lodash/_listCacheGet.js","node_modules/lodash/_listCacheHas.js","node_modules/lodash/_listCacheSet.js","node_modules/lodash/_mapCacheClear.js","node_modules/lodash/_mapCacheDelete.js","node_modules/lodash/_mapCacheGet.js","node_modules/lodash/_mapCacheHas.js","node_modules/lodash/_mapCacheSet.js","node_modules/lodash/_mapToArray.js","node_modules/lodash/_matchesStrictComparable.js","node_modules/lodash/_memoizeCapped.js","node_modules/lodash/_nativeCreate.js","node_modules/lodash/_nativeKeys.js","node_modules/lodash/_nativeKeysIn.js","node_modules/lodash/_nodeUtil.js","node_modules/lodash/_objectToString.js","node_modules/lodash/_overArg.js","node_modules/lodash/_root.js","node_modules/lodash/_setCacheAdd.js","node_modules/lodash/_setCacheHas.js","node_modules/lodash/_setToArray.js","node_modules/lodash/_stackClear.js","node_modules/lodash/_stackDelete.js","node_modules/lodash/_stackGet.js","node_modules/lodash/_stackHas.js","node_modules/lodash/_stackSet.js","node_modules/lodash/_strictIndexOf.js","node_modules/lodash/_stringToPath.js","node_modules/lodash/_toKey.js","node_modules/lodash/_toSource.js","node_modules/lodash/cloneDeep.js","node_modules/lodash/eq.js","node_modules/lodash/get.js","node_modules/lodash/hasIn.js","node_modules/lodash/identity.js","node_modules/lodash/isArguments.js","node_modules/lodash/isArray.js","node_modules/lodash/isArrayLike.js","node_modules/lodash/isBuffer.js","node_modules/lodash/isEqual.js","node_modules/lodash/isFunction.js","node_modules/lodash/isLength.js","node_modules/lodash/isMap.js","node_modules/lodash/isObject.js","node_modules/lodash/isObjectLike.js","node_modules/lodash/isSet.js","node_modules/lodash/isSymbol.js","node_modules/lodash/isTypedArray.js","node_modules/lodash/keys.js","node_modules/lodash/keysIn.js","node_modules/lodash/memoize.js","node_modules/lodash/noop.js","node_modules/lodash/property.js","node_modules/lodash/stubArray.js","node_modules/lodash/stubFalse.js","node_modules/lodash/toString.js","node_modules/lodash/uniqBy.js","node_modules/rxjs/_esm2015/internal/operators/throttle.js","node_modules/rxjs/_esm2015/internal/operators/throttleTime.js","src/app/drive/state/actions/commands.ts","src/app/drive/state/models/drive-page.ts","src/app/drive/state/actions/events.ts","src/app/drive/state/models/drive-state-model.ts","src/app/drive/state/models/drive-state-model-defaults.ts","src/app/drive/messages/loading-toast/loading-toast-messages.ts","src/app/drive/upload-input-config.ts","src/app/drive/folders/api/folders-api-routes.enum.ts","src/app/drive/folders/api/folders-api.service.ts","src/app/drive/drive-entry-api.service.ts","src/app/drive/drive-urls.service.ts","src/app/drive/uploads/drive-upload-validator.ts","src/app/drive/state/drive-state.ts","src/app/drive/sidebar/folders-tree/build-folder-tree.ts","src/app/drive/entries/supported-entry-types.ts","src/app/drive/files/components/file-icon/file-icon.component.ts","src/common/core/utils/kebab-case.ts","src/app/drive/files/components/file-icon/file-icon.component.html","src/app/drive/interactions/entry-drag-preview/entry-drag-preview.component.html","src/app/drive/interactions/entry-drag-preview/entry-drag-preview.component.ts","src/app/drive/permissions/drive-entry-permissions.ts","src/app/drive/sharing/shares-api.service.ts","src/app/drive/sharing/state/share-dialog.state.ts","src/app/drive/sharing/sharing-permissions-button/sharing-permissions-button.component.html","src/app/drive/sharing/sharing-permissions-button/sharing-permissions-button.component.ts","src/app/drive/sharing/entries-access-table/entries-access-table.component.html","src/app/drive/sharing/entries-access-table/entries-access-table.component.ts","src/app/drive/sharing/share-dialog/share-dialog.component.html","src/app/drive/sharing/share-dialog/share-dialog.component.ts","src/app/drive/sharing/links/shareable-links-api.service.ts","src/app/drive/sharing/links/share-link.state.ts","src/app/drive/sharing/links/link-options/link-options.component.html","src/app/drive/sharing/links/link-options/link-options.component.ts","src/app/drive/sharing/share-link-dialog/share-link-dialog.component.html","src/app/drive/sharing/share-link-dialog/share-link-dialog.component.ts","src/common/core/utils/share-link-socially.ts","src/app/drive/folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component.html","src/app/drive/folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component.ts","node_modules/@angular/cdk/__ivy_ngcc__/fesm2015/tree.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/tree.js","src/app/drive/sidebar/folders-tree/folders-tree.service.ts","src/common/core/ui/context-menu/available-context-menus.ts","src/common/core/ui/context-menu/context-menu-ref.ts","src/common/core/ui/context-menu/context-menu-data.ts","src/common/core/ui/context-menu/context-menu.service.ts","src/common/core/ui/context-menu/context-menu.directive.ts","src/app/drive/interactions/drop-targets/base-drop-target.ts","src/app/drive/interactions/drop-targets/folder-drop-target.directive.ts","src/app/drive/sidebar/folders-tree/folders-tree.component.html","src/app/drive/sidebar/folders-tree/folders-tree.component.ts","src/app/drive/entries/move-entries-dialog/move-entries-dialog.component.ts","src/app/drive/entries/rename-entry-dialog/rename-entry-dialog.component.html","src/app/drive/entries/move-entries-dialog/move-entries-dialog.component.html","src/app/drive/entries/rename-entry-dialog/rename-entry-dialog.component.ts","src/app/drive/context-actions/drive-context-actions.ts","src/app/drive/context-actions/actions/entry-actions.ts","src/app/drive/context-actions/actions/folder-actions.ts","src/app/drive/context-actions/actions/shares-actions.ts","src/app/drive/context-actions/actions/trash-actions.ts","src/app/drive/context-actions/actions/trash-page-actions.ts","src/app/drive/interactions/drive-dom-cache.service.ts","src/app/drive/search/main-searchbar.component.ts","src/app/drive/search/drive-search-filters.ts","src/app/drive/search/main-searchbar.component.html","node_modules/rxjs/_esm2015/internal/operators/mapTo.js","node_modules/@angular/material/__ivy_ngcc__/fesm2015/sidenav.js","src/app/drive/sidebar/sidebar-action-buttons/sidebar-action-buttons.component.ts","src/app/drive/sidebar/sidebar-action-buttons/sidebar-action-buttons.component.html","src/app/drive/sidebar/available-space-indicator/available-space-indicator.component.html","src/app/drive/sidebar/available-space-indicator/available-space-indicator.component.ts","src/common/workspaces/workspace-selector/workspace-selector.component.html","src/common/workspaces/workspace-selector/workspace-selector.component.ts","src/app/drive/sidebar/sidebar.component.ts","src/app/drive/sidebar/sidebar.component.html","src/app/drive/details-sidebar/details-panel/entry-description-panel/entry-description-panel.component.html","src/app/drive/details-sidebar/details-panel/entry-description-panel/entry-description-panel.component.ts","src/app/drive/files/components/file-thumbnail/file-thumbnail.component.html","src/app/drive/files/components/file-thumbnail/file-thumbnail.component.ts","src/app/drive/details-sidebar/details-panel/details-panel.component.html","src/app/drive/details-sidebar/details-panel/details-panel.component.ts","src/app/drive/details-sidebar/details-sidebar.component.html","src/app/drive/details-sidebar/details-sidebar.component.ts","src/app/drive/files/components/files-grid/files-grid-item/files-grid-item.component.ts","src/app/drive/files/components/files-grid/files-grid-item/files-grid-item.component.html","src/app/drive/interactions/files-drag-select.service.ts","src/app/drive/interactions/drag-entry.service.ts","src/app/drive/interactions/drive-hammer-interactions.directive.ts","src/app/drive/interactions/toggle-selected-class.directive.ts","src/common/uploads/utils/read-uploaded-folders.ts","src/common/uploads/directives/upload-dropzone.directive.ts","src/common/core/ui/infinite-scroll/infinite.scroll.ts","src/app/drive/interactions/drive-infinite-scroll.directive.ts","src/app/drive/context-actions/components/drive-context-menu/drive-context-menu.component.ts","src/app/drive/context-actions/components/drive-context-menu/drive-context-menu.component.html","src/app/drive/drive-toolbar/entry-breadcrumbs/entry-breadcrumbs.component.html","src/app/drive/drive-toolbar/entry-breadcrumbs/entry-breadcrumbs.component.ts","src/app/drive/drive-toolbar/drive-toolbar.component.ts","src/app/drive/drive-toolbar/drive-toolbar.component.html","src/app/drive/entries/available-sorts.ts","src/app/drive/header/entries-sort-button/entries-sort-button.component.html","src/app/drive/header/entries-sort-button/entries-sort-button.component.ts","src/app/drive/context-actions/components/context-actions-container/context-actions-container.component.html","src/app/drive/context-actions/components/context-actions-container/context-actions-container.component.ts","src/app/drive/drive-toolbar/toolbar-actions/toolbar-actions.component.ts","src/app/drive/drive-toolbar/toolbar-actions/toolbar-actions.component.html","src/app/drive/header/file-list-header/file-list-header.component.ts","src/app/drive/header/file-list-header/file-list-header.component.html","src/app/drive/drive.component.html","src/app/drive/drive.component.ts","src/app/drive/files/components/files-grid/files-grid.component.html","src/app/drive/files/components/files-grid/files-grid.component.ts","src/app/drive/files/components/files-list/files-list.component.html","src/app/drive/files/components/files-list/files-list.component.ts","src/app/drive/messages/no-recent-entries/no-recent-entries.component.ts","src/app/drive/messages/no-recent-entries/no-recent-entries.component.html","src/app/drive/messages/no-trashed-entries/no-trashed-entries.component.ts","src/app/drive/messages/no-trashed-entries/no-trashed-entries.component.html","src/app/drive/messages/no-starred-entries/no-starred-entries.component.ts","src/app/drive/messages/no-starred-entries/no-starred-entries.component.html","src/app/drive/sharing/no-shared-entries/no-shared-entries.component.ts","src/app/drive/sharing/no-shared-entries/no-shared-entries.component.html","src/app/drive/messages/no-search-entries/no-search-entries.component.html","src/app/drive/messages/no-search-entries/no-search-entries.component.ts","src/app/drive/uploads/upload-dropzone/upload-dropzone.component.ts","src/app/drive/uploads/upload-dropzone/upload-dropzone.component.html","src/app/drive/messages/no-folder-entries/no-folder-entries.component.ts","src/app/drive/messages/no-folder-entries/no-folder-entries.component.html","src/app/drive/entries/entries-container/entries-container.component.html","src/app/drive/entries/entries-container/entries-container.component.ts","src/common/file-preview/current-preview-file.ts","src/common/file-preview/preview-url-transformer.ts","src/common/file-preview/base-file-preview.ts","src/common/file-preview/default-preview/default-preview.component.html","src/common/file-preview/default-preview/default-preview.component.ts","src/common/file-preview/text-preview/text-preview.component.html","src/common/file-preview/text-preview/text-preview.component.ts","src/common/file-preview/audio-preview/audio-preview.component.html","src/common/file-preview/audio-preview/audio-preview.component.ts","src/common/file-preview/video-preview/video-preview.component.html","src/common/file-preview/video-preview/video-preview.component.ts","src/common/file-preview/image-preview/image-preview.component.ts","src/common/file-preview/image-preview/image-preview.component.html","src/common/file-preview/pdf-preview/pdf-preview.component.ts","src/common/file-preview/pdf-preview/pdf-preview.component.html","src/common/file-preview/google-docs-viewer/google-docs-viewer.component.html","src/common/file-preview/google-docs-viewer/google-docs-viewer.component.ts","src/common/file-preview/available-previews.ts","src/common/file-preview/preview-files.service.ts","src/app/drive/preview/link-preview-container/link-preview-password-panel/link-preview-password-panel.component.html","src/app/drive/preview/link-preview-container/link-preview-password-panel/link-preview-password-panel.component.ts","src/app/drive/preview/file-preview-overlay/file-preview-toolbar/file-preview-toolbar.component.html","src/app/drive/preview/file-preview-overlay/file-preview-toolbar/file-preview-toolbar.component.ts","src/common/file-preview/preview-container/preview-container.component.html","src/common/file-preview/preview-container/preview-container.component.ts","src/app/drive/preview/file-preview-overlay/file-preview-overlay.component.html","src/app/drive/preview/file-preview-overlay/file-preview-overlay.component.ts","src/app/drive/preview/folder-preview/folder-preview.component.html","src/app/drive/preview/folder-preview/folder-preview.component.ts","src/app/drive/preview/link-preview-container/link-preview-container.component.html","src/app/drive/preview/link-preview-container/link-preview-container.component.ts","src/app/drive/drive-routing.module.ts","node_modules/@angular/material/__ivy_ngcc__/fesm2015/progress-spinner.js","src/app/drive/context-actions/drive-context-menus.ts","src/app/drive/state/handlers/overlay-handler.ts","src/app/drive/state/handlers/donwlod-handler.ts","src/app/drive/messages/loading-toast/loading-toast.component.ts","src/app/drive/messages/loading-toast/loading-toast.component.html","src/app/drive/state/handlers/toast-handler.ts","src/app/drive/uploads/uploads-panel/uploads-panel-item/uploads-panel-item.component.html","src/app/drive/uploads/uploads-panel/uploads-panel-item/uploads-panel-item.component.ts","src/app/drive/uploads/uploads-panel/uploads-panel.component.html","src/app/drive/uploads/uploads-panel/uploads-panel.component.ts","src/app/drive/state/handlers/upload-panel-handler.ts","src/app/drive/state/handlers/dialog-handler.ts","src/app/drive/sharing/sharing.module.ts","src/app/drive/state/handlers/reset-scroll-handler.ts","src/app/drive/state/handlers/page-change-handler.ts","src/app/drive/state/handlers/page-load-handler.ts","src/app/drive/state/handlers/remove-star-handler.ts","src/common/core/ui/context-menu/context-menu.module.ts","src/common/file-preview/file-preview.module.ts","src/common/workspaces/workspace-selector/workspace-selector.module.ts","src/app/drive/drive.module.ts","src/common/admin/file-entry-index/file-entry-index-filters.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/keybinds/keycodes.enum.ts","src/common/core/keybinds/keybinds.service.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/skeleton/skeleton-animations.ts","src/common/core/ui/skeleton/skeleton.component.ts","src/common/core/ui/skeleton/skeleton.module.ts","src/common/core/utils/has-key.ts","src/common/core/utils/remove-null-from-object.ts","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-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/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/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/utils/filter-datatable-data.ts","src/common/datatable/datatable.service.ts","src/common/datatable/delete-resource-message.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/uploads/directives/upload-button.directive.ts","src/common/uploads/formatted-file-size.pipe.ts","src/common/uploads/upload-queue/upload-queue-item.ts","src/common/uploads/validation/default-upload-validator.ts","src/common/uploads/upload-queue/upload-queue.service.ts","src/common/uploads/uploads.module.ts","src/common/uploads/utils/download-file-from-url.ts","src/common/uploads/validation/validations/allowed-extensions-validation.ts","src/common/uploads/validation/validations/blocked-extensions-validation.ts","src/common/workspaces/workspace-config.ts","src/common/workspaces/workspaces.service.ts","src/common/workspaces/types/workspace-invite-notif.ts"],"names":["_c0","MatAutocomplete_ng_template_0_Template","rf","ctx","ɵngcc0","formFieldId_r1","id","ctx_r0","_classList","ariaLabel","_getPanelAriaLabelledby","_c1","_uniqueAutocompleteIdCounter","MatAutocompleteSelectedEvent","constructor","source","option","this","MatAutocompleteBase","_MatAutocompleteMixinBase","mixinDisableRipple","MAT_AUTOCOMPLETE_DEFAULT_OPTIONS","InjectionToken","providedIn","factory","autoActiveFirstOption","_MatAutocompleteBase","_changeDetectorRef","_elementRef","defaults","platform","super","_activeOptionChanges","Subscription","showPanel","_isOpen","displayWith","optionSelected","EventEmitter","opened","closed","optionActivated","inertGroups","SAFARI","_autoActiveFirstOption","value","coerceBooleanProperty","length","coerceStringArray","reduce","classList","className","_setVisibilityClasses","nativeElement","ngAfterContentInit","_keyManager","ActiveDescendantKeyManager","options","withWrap","change","subscribe","index","emit","toArray","_setVisibility","ngOnDestroy","unsubscribe","_setScrollTop","scrollTop","panel","_getScrollTop","markForCheck","_emitSelectEvent","event","labelId","ariaLabelledby","_visibleClass","_hiddenClass","ɵfac","t","ɵngcc1","ɵdir","type","viewQuery","TemplateRef","_t","template","first","inputs","panelWidth","outputs","features","MatAutocomplete","arguments","ɵMatAutocomplete_BaseFactory","ɵcmp","selectors","contentQueries","dirIndex","MAT_OPTGROUP","MatOption","optionGroups","hostAttrs","disableRipple","exportAs","provide","MAT_OPTION_PARENT_COMPONENT","useExisting","ngContentSelectors","decls","vars","consts","directives","ɵngcc2","styles","encapsulation","changeDetection","MAT_AUTOCOMPLETE_SCROLL_STRATEGY","MAT_AUTOCOMPLETE_SCROLL_STRATEGY_FACTORY_PROVIDER","deps","Overlay","useFactory","overlay","scrollStrategies","reposition","MAT_AUTOCOMPLETE_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","forwardRef","MatAutocompleteTrigger","multi","_MatAutocompleteTriggerBase","_element","_overlay","_viewContainerRef","_zone","scrollStrategy","_dir","_formField","_document","_viewportRuler","_defaults","_componentDestroyed","_autocompleteDisabled","_manuallyFloatingLabel","_viewportSubscription","_canOpenOnNextFocus","_closeKeyEventStream","Subject","_windowBlurHandler","activeElement","panelOpen","_onChange","_onTouched","position","autocompleteAttribute","_overlayAttached","optionSelections","defer","autocomplete","merge","map","onSelectionChange","onStable","pipe","take","switchMap","_scrollStrategy","ngAfterViewInit","window","_getWindow","runOutsideAngular","addEventListener","ngOnChanges","changes","_positionStrategy","_setStrategyPositions","_overlayRef","updatePosition","removeEventListener","_destroyPanel","complete","openPanel","_attachOverlay","_floatLabel","closePanel","_resetLabel","hasAttached","detach","_closingActionsSubscription","detectChanges","tabOut","filter","_getOutsideClickStream","detachments","of","MatOptionSelectionChange","activeItem","fromEvent","clickTarget","_isInsideShadowRoot","composedPath","target","formField","customOrigin","connectedTo","elementRef","contains","overlayElement","writeValue","Promise","resolve","then","_setTriggerValue","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","disabled","_handleKeydown","keyCode","ESCAPE","hasModifierKey","preventDefault","activeOption","ENTER","_selectViaInteraction","_resetActiveItem","prevActiveItem","isArrowKey","UP_ARROW","DOWN_ARROW","TAB","onKeydown","_canOpen","_scrollToOption","activeItemIndex","_handleInput","parseFloat","_previousValue","_handleFocus","shouldAnimate","floatLabel","_animateAndLockLabel","_subscribeToClosingActions","firstStable","optionChanges","tap","reapplyLastPosition","delay","wasOpen","panelClosingActions","_setValueAndClose","dispose","toDisplay","inputValue","_control","_clearPreviousSelectedOption","focus","skip","forEach","selected","deselect","_a","_getShadowRoot","overlayRef","setOrigin","_getConnectedElement","updateSize","width","_getPanelWidth","_portal","TemplatePortal","getLabelId","create","_getOverlayConfig","keydownEvents","next","stopPropagation","attach","OverlayConfig","positionStrategy","_getOverlayPosition","direction","panelClass","overlayPanelClass","strategy","flexibleConnectedTo","withFlexibleDimensions","withPush","belowPositions","originX","originY","overlayX","overlayY","_aboveClass","abovePositions","positions","withPositions","getConnectedOverlayOrigin","_getHostWidth","getBoundingClientRect","setFirstItemActive","setActiveItem","element","readOnly","defaultView","labelCount","_countGroupLabelsBeforeOption","_getHostElement","newScrollPosition","_getOptionScrollPosition","offsetTop","offsetHeight","ɵngcc3","ɵngcc4","MAT_FORM_FIELD","DOCUMENT","ɵngcc5","autocompleteDisabled","ɵMatAutocompleteTrigger_BaseFactory","hostVars","hostBindings","$event","toString","MatAutocompleteModule","ɵmod","ɵinj","providers","imports","OverlayModule","MatOptionModule","MatCommonModule","CommonModule","CdkScrollableModule","MAT_CHIP_REMOVE","MAT_CHIP_AVATAR","MAT_CHIP_TRAILING_ICON","MatChipBase","_MatChipMixinBase","mixinTabIndex","mixinColor","MatChip","_ngZone","globalRippleOptions","animationMode","tabIndex","_hasFocus","chipListSelectable","_chipListMultiple","_chipListDisabled","_selected","_selectable","_disabled","_removable","_onFocus","_onBlur","selectionChange","destroyed","removed","_addHostClassName","_chipRippleTarget","createElement","add","appendChild","_chipRipple","RippleRenderer","setupTriggerEvents","rippleConfig","_animationsDisabled","parseInt","coercedValue","_dispatchSelectionChange","undefined","_value","textContent","selectable","hasAttribute","tagName","toLowerCase","chip","_removeTriggerEvents","select","selectViaInteraction","toggleSelected","isUserInput","remove","removable","_handleClick","DELETE","BACKSPACE","SPACE","_blur","run","MAT_RIPPLE_GLOBAL_OPTIONS","ANIMATION_MODULE_TYPE","avatar","trailingIcon","removeIcon","ariaSelected","color","MatChipRemove","_parentChip","nodeName","setAttribute","parentChip","MAT_CHIPS_DEFAULT_OPTIONS","MatChipListBase","_defaultErrorStateMatcher","_parentForm","_parentFormGroup","ngControl","_MatChipListMixinBase","mixinErrorState","nextUniqueId","MatChipListChange","MatChipList","controlType","_lastDestroyedChipIndex","_destroyed","_uid","_tabIndex","_userTabIndex","_multiple","_compareWith","o1","o2","_required","ariaOrientation","valueChange","valueAccessor","multiple","_selectionModel","empty","_syncChipsState","_initializeSelection","_chipInput","stateChanges","placeholder","_placeholder","focused","_hasFocusedChip","chips","FocusKeyManager","withVerticalOrientation","withHomeAndEnd","withHorizontalOrientation","takeUntil","dir","_allowFocusEscape","startWith","_resetChips","_updateTabIndex","_updateFocusForDestroyedChips","ngOnInit","SelectionModel","ngDoCheck","updateErrorState","_dropSubscriptions","registerInput","inputElement","setDescribedByIds","ids","_ariaDescribedby","join","_setSelectionByValue","onContainerClick","_originatesFromChip","_focusInput","_keydown","_isInputEmpty","setLastItemActive","newChipIndex","Math","min","_isValidIndex","_clearSelection","Array","isArray","currentValue","_selectValue","_sortValues","correspondingChip","find","clear","_propagateChanges","fallbackValue","valueToEmit","setTimeout","_markAsTouched","_listenToChipsFocus","_listenToChipsSelection","_listenToChipsRemoved","_chipFocusSubscription","_chipBlurSubscription","_chipSelectionSubscription","_chipRemoveSubscription","chipSelectionChanges","isSelected","chipFocusChanges","chipIndex","indexOf","updateActiveItem","chipBlurChanges","chipRemoveChanges","currentElement","parentElement","some","role","required","errorState","compareWith","errorStateMatcher","MatFormFieldControl","nextUniqueId$1","MatChipInput","_defaultOptions","_addOnBlur","separatorKeyCodes","chipEnd","_inputElement","_chipList","_emitChipEnd","addOnBlur","_focus","_isSeparatorKey","input","_onInput","Set","has","invalid","chipList","ɵ0","MatChipsModule","ErrorStateMatcher","useValue","MatFormFieldModule","ObserversModule","_c2","_c3","enterDuration","_c4","MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS","disableToggleValue","MAT_SLIDE_TOGGLE_VALUE_ACCESSOR","MatSlideToggle","MatSlideToggleChange","checked","MatSlideToggleBase","_MatSlideToggleMixinBase","mixinDisabled","_focusMonitor","_animationMode","_","_uniqueId","_checked","name","labelPosition","toggleChange","monitor","focusOrigin","stopMonitoring","_onChangeEvent","_emitChangeEvent","_onInputClick","origin","focusVia","toggle","_onLabelTextChange","_thumbEl","_thumbBarEl","_r0","_r4","inputId","trim","_MatSlideToggleRequiredValidatorModule","MatSlideToggleModule","MatRippleModule","module","exports","equal","a","b","i","keys","RegExp","flags","valueOf","Object","prototype","hasOwnProperty","call","key","DataView","require","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","entries","entry","set","get","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","values","__data__","push","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","data","size","root","Symbol","Uint8Array","WeakMap","array","iteratee","predicate","resIndex","result","baseIndexOf","comparator","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","offset","baseAssignValue","eq","object","objValue","copyObject","keysIn","defineProperty","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isMap","isObject","isSet","cloneableTags","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","tag","isFunc","stacked","subValue","props","objectCreate","baseCreate","proto","fromIndex","fromRight","castPath","toKey","path","arrayPush","keysFunc","symbolsFunc","getRawTag","objectToString","symToStringTag","toStringTag","baseFindIndex","baseIsNaN","strictIndexOf","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","other","equalArrays","equalByTag","equalObjects","objectTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isFunction","isMasked","toSource","reIsHostCtor","reIsNative","Function","replace","test","isLength","typedArrayTags","baseMatches","baseMatchesProperty","identity","property","isPrototype","nativeKeys","nativeKeysIn","isProto","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isKey","isStrictComparable","baseGet","n","arrayMap","isSymbol","symbolProto","symbolToString","baseToString","func","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","includes","isCommon","seen","outer","computed","seenIndex","cache","stringToPath","arrayBuffer","byteLength","freeExports","nodeType","freeModule","Buffer","allocUnsafe","buffer","slice","copy","cloneArrayBuffer","dataView","byteOffset","reFlags","regexp","exec","lastIndex","symbolValueOf","symbol","typedArray","isNew","newValue","getSymbols","getSymbolsIn","noop","getNative","e","arraySome","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","message","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","global","baseGetAllKeys","isKeyable","baseIsNative","getValue","getPrototype","getPrototypeOf","objectProto","nativeObjectToString","isOwn","unmasked","arrayFilter","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","Ctor","ctorString","hasFunc","nativeCreate","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","reIsUint","reIsDeepProp","reIsPlainProp","uid","coreJsData","maskSrcKey","IE_PROTO","assocIndexOf","splice","pop","getMapData","memoize","freeProcess","process","nodeUtil","types","binding","transform","arg","freeSelf","self","pairs","LARGE_ARRAY_SIZE","memoizeCapped","rePropName","reEscapeChar","string","charCodeAt","match","number","quote","subString","funcToString","CLONE_DEEP_FLAG","defaultValue","baseHasIn","hasPath","baseIsArguments","stubFalse","baseIsMap","baseUnary","nodeIsMap","baseIsSet","nodeIsSet","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeys","isArrayLike","baseKeysIn","resolver","TypeError","memoized","args","apply","Cache","baseProperty","basePropertyDeep","baseIteratee","baseUniq","defaultThrottleConfig","leading","trailing","throttleTime","duration","scheduler","async","config","lift","ThrottleTimeOperator","subscriber","ThrottleTimeSubscriber","Subscriber","destination","_hasTrailingValue","_trailingValue","_next","throttled","schedule","dispatchNext","_complete","clearThrottle","LoadUserFolders","LoadUserSpaceUsage","BuildFolderTree","folders","OpenFolder","folder","OpenSearchPage","queryParams","SelectEntries","SelectAllEntries","DeselectAllEntries","DeleteSelectedEntries","OpenUploadsPanel","CloseUploadsPanel","AddEntries","MoveEntries","OpenDialog","dialog","OpenConfirmDialog","confirmAction","SetViewMode","mode","ToggleDetailsSidebar","ToggleSidebar","UploadFiles","files","RestoreTrashedEntries","DeleteTrashedEntriesForever","EmptyTrash","OpenFilePreview","DownloadEntries","link","password","AddStar","RemoveStar","RemoveEntries","LoadMoreEntries","loadMore","ReloadPageEntries","page","CopySelectedEntries","OpenUploadWindow","ShowLoadingToast","HideLoadingToast","ResetState","UpdateEntries","SetCurrentUser","user","SetWorkspace","workspace","UpdateEntryDescription","description","DrivePage","params","viewName","folderHash","hasActions","sortColumn","sortDirection","RECENT_PAGE","disableSort","recentOnly","SEARCH_PAGE","SHARES_PAGE","sharedOnly","TRASH_PAGE","deletedOnly","WORKSPACE_INDEX_PAGE","STARRED_PAGE","starredOnly","FolderPage","hash","RecentEntriesPageOpened","orderBy","FolderPageOpened","SharesFolderOpened","TrashPageOpened","WorkspacesIndexPageOpened","SearchPageOpened","StarredPageOpened","EntriesSelectedViaDrag","EntrySelectedViaContextMenu","EntryTapped","ctrlKey","EntryDoubleTapped","FileDeleteSuccess","deletedFiles","EntryContextMenuOpened","NewFolderCreated","EntryRenamed","newName","StartedDragging","StoppedDragging","MoveEntriesSuccess","oldLocation","MoveEntriesFailed","messages","TrashedEntriesDeleteSuccess","TrashedEntriesRestoreSuccess","NotEnoughSpaceError","UserSpaceUsageChanged","BreakpointChanged","status","DRIVE_STATE_MODEL_DEFAULTS","isMobile","activePage","folderTree","flatFolders","userFoldersLoaded","selectedEntries","dragging","loading","uploadsPanelOpen","viewMode","detailsVisible","sidebarOpen","currentUser","activeWorkspace","spaceUsage","available","used","meta","currentPage","lastPage","LoadingToastMessages","DRIVE_UPLOAD_INPUT_CONFIG","FOLDERS_API_ROUTES","FoldersApiService","http","GET_ALL","post","CREATE","DriveEntryApiService","userId","entryId","put","delete","emptyTrash","entryIds","DriveUrlsService","driveRoot","DriveUploadValidator","DEFAULT_MAX_FILE_SIZE_MB","validations","maxSize","getMaxFileSize","i18n","allowedExtensions","getAllowedExtensions","blockedExtensions","getBlockedExtensions","extensions","settings","convertToBytes","getJson","DriveState","foldersApi","entriesApi","router","driveUrls","uploads","store","localStore","validator","workspaces","toast","uploadInputConfig","state","parent_id","f","rootFolder","every","tags","spaceUsed","spaceAvail","permission","folderUser","users","u","owns_entry","entry_permissions","activeFolder","userHasPermission","edit","workspace_id","member","is_owner","permissions","findIndex","p","getAllForCurrentUser","response","patchState","dispatch","action","getState","tree","hashTable","len","children","treeHash","parent","oldState","newState","orderDir","query","filters","transformQueryParams","getEntriesForFolder","concat","last_page","current_page","currentFolder","deleted_at","title","body","ok","navigate","current","alreadySelected","curr","entryDoubleTapped","selectSnapshot","selectedEntryIds","actions","selectedEntryParent","canMoveEntriesTo","moveEntries","finalize","errResponse","errors","currentEntries","newEntries","newSize","sum","file_size","enoughSpaceLeftToUpload","destinationId","start","httpParams","parentId","fileEntry","all_parents","newEntry","deleteForever","restoredEntries","restore","addStar","removeStar","removeTag","open","replacements","count","copyEntries","location","activeWorkspace$","directory","getSpaceUsage","mainEntries","updatedEntry","mainIndex","selectedIndex","update","setState","folderId","file","movingEntries","startsWith","cancelUncompleted","selectedEntry","selectedEntryOrActiveFolder","userSpaceUsed","userSpaceAvailable","SUPPORTED_ENTRY_TYPES","FileIconComponent","mime","split","EntryDragPreviewComponent","DRIVE_ENTRY_FULL_PERMISSIONS","view","download","SharesApiService","SetInitialUsers","UpdateUserPermissions","RemoveUser","SetUsers","ShareEntries","payload","ShareEntriesFailed","ShareDialogState","sharesApi","usersWithAccess","original","loadingUsers","all","uniqueUsers","assign","varies","toggleUserLoading","changePermissions","updateUsers","detachUser","shareEntries","updateEntriesInDriveStore","errorResponse","isLoading","newUsers","updatedEntries","SharingPermissionsButtonComponent","api","compact","updateUserPermissions","newPermissions","selectPermission","EntriesAccessTableComponent","x","ShareDialogComponent","dialogRef","actions$","destroyed$","suggestUserEmails","getAll","perPage","email","resetModel","bindToShareError","bindToShareModel","emails","shareModel","setErrorMessages","valueChanges","ShareableLinksApiService","linkId","LoadShareableLink","UpdateShareableLink","CreateShareableLink","DeleteShareableLink","ToggleOptionsPanel","LinkCopySuccess","ResetShareLinkState","defaultState","optionsPanelVisible","backendErrors","linkOptions","allowDownload","allowEdit","expiresAt","ShareLinkState","linksApi","entry_id","cachedLink","findByEntryId","autoCreate","LinkOptionsComponent","form","date","time","passwordVisible","expirationVisible","bindToLinkChange","getPayload","link$","hydrateExpirationForm","setValue","expires_at","patchValue","allow_edit","allow_download","parts","substr","Date","toJSON","saveChanges","toggleOptionsPanel","ShareLinkDialogComponent","shareableLink$","subscriptions","bindToOptionsPanelToggle","s","close","focusInput","getBaseUrl","sub","optionsVisible","network","image","url","base","href","left","innerWidth","top","innerHeight","document","getElementById","height","padding","opacity","overflow","CrupdateFolderDialogComponent","folderName","setErrors","confirm","FlatTreeControl","expansionModel","dataNode","_trackByValue","expand","collapse","isExpanded","toggleDescendants","collapseDescendants","expandDescendants","collapseAll","toBeProcessed","getDescendants","trackBy","getLevel","isExpandable","results","dataNodes","expandAll","node","CDK_TREE_NODE_OUTLET_NODE","CdkTreeNodeOutlet","viewContainer","_node","CdkTreeNodeOutletContext","$implicit","CdkTreeNodeDef","when","CdkTree","_differs","_onDestroy","_levels","viewChange","BehaviorSubject","end","Number","MAX_VALUE","_dataSource","dataSource","_switchDataSource","_dataDiffer","_nodeOutlet","disconnect","_dataSubscription","ngAfterContentChecked","defaultNodeDefs","_nodeDefs","def","_defaultNodeDef","_observeRenderChanges","dataStream","isDataSource","connect","isObservable","renderNodeChanges","dataDiffer","parentData","diff","forEachOperation","item","adjustedPreviousIndex","currentIndex","previousIndex","insertNode","move","_getNodeDef","nodeData","context","level","treeControl","createEmbeddedView","CdkTreeNode","mostRecentTreeNode","_tree","_dataChanges","_role","_data","_setRoleFromData","_setExpanded","_expanded","_isAriaExpanded","_parentNodeAriaLevel","nodeElement","isNodeElement","coerceNumberProperty","getAttribute","cssUnitPattern","CdkTreeNodePadding","_treeNode","indentUnits","_indent","_setPadding","_level","_setLevelInput","indent","_setIndentInput","_paddingIndent","nodeLevel","forceChange","_currentPadding","paddingProp","resetProp","style","units","CdkTreeNodeToggle","_recursive","_toggle","recursive","CdkTreeModule","_MatTreeNodeMixinBase","MatTreeNode","MatTreeNodeDef","ɵMatTreeNodeDef_BaseFactory","MatTreeNodePadding","ɵMatTreeNodePadding_BaseFactory","MatTreeNodeOutlet","MatTree","ɵMatTree_BaseFactory","MatTreeNodeToggle","ɵMatTreeNodeToggle_BaseFactory","MatTreeModule","MatTreeFlattener","transformFunction","getChildren","_flattenNode","resultNodes","parentMap","flatNode","childrenNodes","_flattenChildren","child","childParentMap","flattenNodes","structuredData","expandFlattenedNodes","nodes","currentExpand","MatTreeFlatDataSource","DataSource","_treeControl","_treeFlattener","initialData","_flattenedData","_expandedData","collectionViewer","changed","FoldersTreeService","createTreeFlattener","createTreeControl","createTreeDataSource","items","flattener","transformer","control","expandable","AVAILABLE_CONTEXT_MENUS","ContextMenuRef","backdropClick","attachments","backdropElement","CONTEXT_MENU_DATA","ContextMenu","zone","injector","events","component","createOverlay","openContextMenu","portal","bindEventsToOverlay","removeLastOrigin","getMenuPositionStrategy","hasBackdrop","backdropClass","contextMenuElement","createOriginFromEvent","primary","lastOrigin","HTMLElement","EventTarget","clientY","offsetY","clientX","offsetX","ContextMenuDirective","el","contextMenu","_availableMenus","disableContextMenu","availableMenus","getMenuComponent","getMenuData","BaseDropTarget","subs","onDragStart","onDragEnd","enter","onDragEnter","leave","onDragLeave","classes","canDrop","active","removeDragOverClass","executeAction","FolderDropTargetDirective","FoldersTreeComponent","expanded","showRootNode","folderSelected","selectedFolderId$","sub1","userFolders","fs","sub2","MoveEntriesDialogComponent","destination$","loading$","canMove$","failure","success","RenameEntryDialogComponent","entryName","DriveContextActions","updateStatus","multipleEntriesSelected","allStarred","allSelectedEntriesStarred","onlyFoldersSelected","getSelectedFolder","getSelectedEntries","EntryActions","icon","showInCompact","execute","visible","hasPermission","autoFocus","separatorBefore","openUploadWindow","FolderActions","noopTrue","SharesActions","shares","TrashActions","bodyBold","TrashPageActions","DriveDomCacheService","MainSearchbarComponent","driveApi","currentUSer","label","operator","defaultOperator","searchControl","filterChange$","metaSub","searchEl","combineLatest","distinctUntilChanged","debounceTime","oldParams","inSearchPage","routerState","snapshot","openSearchPage","mapTo","MapToOperator","MapToSubscriber","MatDrawerContainer_div_0_Template","_r3","_onBackdropClicked","_isShowingBackdrop","MatDrawerContainer_mat_drawer_content_3_Template","MatSidenavContainer_div_0_Template","MatSidenavContainer_mat_sidenav_content_3_Template","_c5","matDrawerAnimations","transformDrawer","trigger","transition","animate","MAT_DRAWER_DEFAULT_AUTOSIZE","MAT_DRAWER_CONTAINER","MatDrawerContent","CdkScrollable","_container","scrollDispatcher","ngZone","_contentMarginChanges","MatDrawerContainer","_contentMargins","right","MatDrawer","_focusTrapFactory","_platform","_doc","_elementFocusedBeforeDrawerWasOpened","_enableAnimations","_position","_mode","_disableClose","_opened","_animationStarted","_animationEnd","_animationState","openedChange","_openedStream","o","openedStart","fromState","toState","_closedStream","closedStart","onPositionChanged","_modeChanged","_takeFocus","_isFocusWithinDrawer","_restoreFocus","disableClose","y","_updateFocusTrapState","_autoFocus","_focusTrap","focusInitialElementWhenReady","hasMovedFocus","_openedVia","blur","activeEl","isBrowser","destroy","openedVia","_closeViaBackdropClick","_setOpen","isOpen","restoreFocus","_getWidth","offsetWidth","enabled","_animationStartListener","_animationDoneListener","animation","viewportRuler","defaultAutosize","_drawers","QueryList","_doCheckSubject","_validateDrawers","updateContentMargins","_autosize","_start","_end","_backdropOverride","_userContent","_content","_allDrawers","drawer","reset","notifyOnChanges","_watchDrawerToggle","_watchDrawerPosition","_watchDrawerMode","_isDrawerOpen","_left","_right","_isPushed","_setContainerClass","onMicrotaskEmpty","isAdd","_closeModalDrawersViaBackdrop","_canHaveBackdrop","autosize","MatSidenavContent","changeDetectorRef","container","MatSidenavContainer","MatSidenav","_fixedInViewport","_fixedTopGap","_fixedBottomGap","ɵMatSidenav_BaseFactory","fixedInViewport","fixedTopGap","fixedBottomGap","ɵMatSidenavContainer_BaseFactory","MatSidenavModule","PlatformModule","SidebarActionButtonsComponent","openUploadsPanel","openNewFolderDialog","canUpload","AvailableSpaceIndicatorComponent","spaceUsedPercent","WorkspaceSelectorComponent","modal","vcr","cd","indexUserWorkspaces","m","WorkspaceModule","components","crupdateModal","viewContainerRef","manageMembers","menuTrigger","closeMenu","resource","afterClosed","confirmed","SidebarComponent","urls","openFolder","EntryDescriptionPanelComponent","editingDescription$","savingDescription$","textArea","queryList","FileThumbnailComponent","thumbnail","separator","DetailsPanelComponent","owner$","DetailsSidebarComponent","FilesGridItemComponent","driveEntry","FilesDragSelectService","initial","cacheClientRects","createSelectBox","bindScroll","gridElements","getGridElements","hammerToRelative","scrollCont","selectBox","lastPanEvent","resizeBox","removeSelectBox","dispatchSelectedAction","unbindScroll","newPos","getNewSelectorPosition","scrollAndRepositionSelector","selectIntersectingElements","tmp","x1","y1","x2","y2","bottom","area","rectToRelative","filesContRect","edge","reachedAreaEdge","scrollBy","scrollDiff","scrollValue","abs","scrollHeight","applyPosition","selectedBoxRect","gridItem","rect","center","dataset","filesCont","scrollContRect","from","querySelectorAll","scrollListener","DragEntryService","domCache","dragPreview","DriveHammerInteractionsDirective","dragSelect","dragEntry","bindToHammer","hammerManager","enable","createHammerManager","onPanStart","onPan","onPanEnd","onTap","onDoubleTap","Hammer","Manager","Tap","pan","Pan","doubleTap","taps","recognizeWith","on","gridElement","getEntryEl","panService","getEntryByEl","en","entryEl","srcEvent","metaKey","closest","ToggleSelectedClassDirective","els","readDirRecursive","readEntriesRecursive","createReader","childEntry","isDirectory","transformFileEntry","reader","allEntries","readEntries","fullPath","UploadDropzoneDirective","disableDropzoneClick","disableDropzone","uploadConfig","filesDropped","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","clickButton","handleClick","removeClassesFromDropzone","emitUploadEvent","dropzoneDisabled","dataTransfer","dropEffect","newEl","elementFromPoint","kind","webkitGetAsEntry","hasFiles","InfiniteScroll","threshold","scrollSub","getScrollContainer","capture","passive","onScroll","canLoadMore","targetCanScroll","scrollY","documentElement","loadMoreItems","DriveInfiniteScrollDirective","canLoadMoreEntries","DriveContextMenuComponent","EntryBreadcrumbsComponent","breadcrumb","foldersLoaded","bindToActivePage","activePageSub","breadcrumbs","getRootBreadcrumb","folderPath","getBreadcrumbForFolder","allFolders","pathFolder","workspaceId","activeId$","ROOT_FOLDER_PAGE","userOwnsActiveFolder","generateBreadCrumb","DriveToolbarComponent","AVAILABLE_SORTS","DEFAULT_VALUE","column","EntriesSortButtonComponent","btnDisabled","availableSorts","sort$","propagateChange","sort","ContextActionsContainerComponent","hasMoreActions$","subscription","combined","setActions","moreActionsButton","getActions","setActionsForEntry","isOwner","userOwnsSelectedEntries","ToolbarActionsComponent","toggleViewMode","ToggleDetails","anythingSelected","detailsOpen","FileListHeaderComponent","sortFormControl","emitEvent","DriveComponent","route","localStorage","breakpoints","setViewMode","cacheDemoElements","observeBreakpointChanges","bindToWorkspace","getModel","model$","filesContainer","scrollContainer","observe","matches","sub3","w","bindToNotificationClick","toggleSidebar","uploadFiles","FilesGridComponent","disableInteractions","FilesListComponent","datatable","init","v","NoRecentEntriesComponent","NoTrashedEntriesComponent","NoStarredEntriesComponent","NoSharedEntriesComponent","NoSearchEntriesComponent","noQueryOrFilters$","UploadDropzoneComponent","NoFolderEntriesComponent","EntriesContainerComponent","keybinds","tabindex","keybindSub","listenOn","addWithPreventDefault","activePageName","entriesEmpty","CURRENT_PREVIEW_FILE","PREVIEW_URL_TRANSFORMER","BaseFilePreview","sanitizer","filePreviewWrapper","bypassSecurityTrustResourceUrl","getSrc","responseType","DefaultPreviewComponent","TextPreviewComponent","content$","fileTooLarge$","loadFileContents","getContents","content","AudioPreviewComponent","invalidMedia","canPlayVideo","src","player","play","canPlayType","playerEl","VideoPreviewComponent","ImagePreviewComponent","PdfPreviewComponent","GoogleDocsViewerComponent","showDefaultPreview$","showDefaultPreview","iframe","onload","clearTimeout","timeoutRef","stopLoading","getIframeSrc","catch","reject","previewUrl","preview_token","getFullPreviewUrl","encodeURIComponent","AVAILABLE_PREVIEWS","DefaultPreviews","text","video","audio","pdf","spreadsheet","powerPoint","word","PreviewFilesService","availablePreviews","previewUriTransformer","asObservable","haveNext","updateMeta","updatePortal","havePrevious","newPointer","oldPointer","pointer","total","getCurrent","createInjector","activeFile","injectionTokens","LinkPreviewPasswordPanelComponent","links","passwordControl","passwordError$","passwordValid","checkPassword","handlePasswordCheck","submitPassword","previewFiles","FilePreviewToolbarComponent","showLogo","disableDownload","showCloseButton","PreviewContainerComponent","downloadSub","comp","instance","FilePreviewOverlayComponent","bindToDownload","previewContainer","optionsButton","shareableLink","closeOverlay","FolderPreviewComponent","linkApi","breadcrumb$","pagination$","loadChildren","generateBreadcrumb","setPagination","folderChildren","ent","activeEntry","hideMoreOptionsBtn","getEntry","openPreviewOverlay","makeLinkHash","subFolder","replaceChildren","order","findByHash","withEntries","pagination","onClick","LinkPreviewContainerComponent","data$","passwordPanelVisible$","linkChanged","setBackgroundClass","togglePasswordPanel","showPreview","importEntry","dashboardRoutes","canActivate","WorkspaceWrapperModule","DriveRoutingModule","MatProgressSpinner__svg_circle_1_Template","_spinnerAnimationLabel","_getStrokeDashOffset","_getStrokeCircumference","_getCircleStrokeWidth","_getCircleRadius","MatProgressSpinner__svg_circle_2_Template","ctx_r1","MatSpinner__svg_circle_1_Template","MatSpinner__svg_circle_2_Template","MatProgressSpinnerBase","_MatProgressSpinnerMixinBase","MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS","diameter","MatProgressSpinner","_diameter","_fallbackAnimation","trackedDiameters","_diameters","_getSpinnerAnimationLabel","head","EDGE","TRIDENT","_noopAnimations","_forceAnimations","strokeWidth","_styleRoot","_attachStyleNode","_strokeWidth","max","_getViewBox","viewBox","PI","styleRoot","currentDiameter","diameters","diametersForElement","styleTag","_getAnimationText","strokeCircumference","MatSpinner","MatProgressSpinnerModule","DRIVE_CONTEXT_MENUS","OverlayHandler","DownloadHandler","getDownloadUrl","hashes","getEntryHashes","LoadingToastComponent","ToastHandler","entriesDeleted","entriesStarred","entriesUnstarred","entriesMoveFailed","folderCreated","entriesMoved","entriesDeletedForever","entriesRestoredFromTrash","entryRenamed","linkCopiedToClipboard","notEnoughSpace","loadingToast","onAction","oldName","toastRef","openComponent","dismiss","UploadsPanelItemComponent","uploadQueue","progress","upload","progress$","animationFrame","isEmpty","UploadsPanelComponent","activeUploads","minimized$","toggleMinimized","overlayConfig","mobilePosition","UploadPanelHandler","overlayPanel","closeUploadsPanel","uploadPanelRef","DialogHandler","openConfirmDialog","beforeClosed","SharingModule","ResetScrollHandler","scrollTo","PageChangeHandler","PageLoadHandler","urlAfterRedirects","isLoggedIn","getPageLoadAction","getPageUriParams","pageName","search","firstChild","uri","RemoveStarHandler","ContextMenuModule","FilePreviewModule","useClass","WorkspaceSelectorModule","STATE_HANDLERS","DriveModule","handler","ext","FILE_ENTRY_TYPE_FILTER","FILE_ENTRY_INDEX_FILTERS","FindUserModalComponent","searchFormControl","users$","searchUsers","normalizeUser","display_name","model_type","Keycodes","Keybinds","bindings","callback","keybind","parseKeybindString","keybindString","fireIfInputFocused","executeBindings","bindingMatches","toUpperCase","ctrl","shiftKey","shift","parsed","part","ChipInputComponent","emailsInput","selectMode","formControl","items$","suggestedValues$","suggestFn","bindToSearchControl","parseEmailsOnPaste","propagate","matAutocomplete","duplicate","findValueIndex","inputEl","filtered","clipboardData","getData","selection","getSelection","rangeCount","deleteFromDocument","addFromAutocomplete","ChipsModule","SKELETON_ANIMATIONS","SkeletonComponent","theme","variant","dark","isDarkMode","SkeletonModule","hasKey","val","removeNullFromObject","obj","DatatableFilter","FilterOperator","FilterControlType","Select","inputType","operators","componentData","ALL_PRIMITIVE_OPERATORS","ne","gt","gte","lt","lte","TimestampFilter","toISOString","CreatedAtFilter","UpdatedAtFilter","filterSelected","FilterSuggestionsComponent","originalOrder","anyFocused","k","filterKey","SelectModelControlComponent","value$","openSelectModelDialog","model","FILTER_OPERATOR_NAMES","doesntHave","OperatorDisplayNamePipe","isMobile$","OperatorSelectComponent","resizeSelect","ActiveFilterComponent","compareFilterValueFn","val1","val2","resizeInput","valueInput","ActiveFiltersComponent","fb","opts","group","controls","addControl","last","focusValueInput","removeControl","removeByKey","controlKey","getFocusedIndex","previous","SearchInputWithFiltersComponent","filterChange","inputFocus","filterBarHeight","filterDropdownVisible$","keyedFilters","haveFiltersOrQuery$","watchForSizeChanges","setFiltersFromQuery","setupKeybinds","subscribeToCloseActions","bindToFormValueChange","activeFilters","searchInput","closeActionsStream$","searchInputIsFocused","selectionStart","formData","encodeFilterFormData","ResizeObserver","contentRect","box","qp","decodeFilterString","filterValue","cursorAtStartOfSearchInput","focusLast","removeCurrentlyFocused","focusPrevious","getByIndex","lastIsFocused","cursorAtEndOfSearchInput","suggestions","toggleFilterDropdown","newIndex","focusItemAt","getFocusedFilter","addFilterFromDropdownClick","btoa","JSON","stringify","filterString","filtersFromQuery","parse","atob","decodeURIComponent","SearchInputWithFiltersModule","DatatableModule","Paginator","params$","paginatedOnce$","response$","dontUpdateQueryParams","perPageCacheKey","noResults$","r","userParams","currentQueryParams","per_page","paginate","cursor","next_cursor","prev_cursor","newPerPage","firstPagination","updateQueryParams","replaceUrl","sortingDataAccessor","sortHeaderId","numberValue","filterDatatableData","dataStr","objectToStr","transformedFilter","currentTerm","DatatableService","filters$","searchTerm$","staticParams$","paginator","ignoreNextParamChange","originalData$","selectedRows$","tableData","staticParams","connectToPaginator","initialSearchTerm","searchControlSub","mainSub","applyLocalTransforms","paginatorSub","pairwise","prev","infiniteScroll","valueA","valueB","valueAType","valueBType","comparatorResult","cmp","modifiedResource","DELETE_RESOURCE_MESSAGE","TableSortHeaderComponent","datable","focusMonitor","arrowVisible","arrowDirection","columnName","sortSub","onMouseLeave","getDirection","changeSort","UploadButtonDirective","filesSelected","FormattedFileSizePipe","bytes","precision","isNaN","isFinite","UploadQueueItem","queueId","canceled$","processing$","uploadedResponse$","ReplaySubject","percentage","error$","customData","uploadedFile","completed","setProgress","eta","DefaultUploadValidator","showToast","UploadQueueService","defaultValidator","uploads$","totalProgress$","uploadsAdded$","count$","pending","queueItem","c","uploadQueueItems","transformUploads","transformed","updateCount","mergeMap","uploadQueueItem","catchError","handleUploadFailure","bubbleError","throwError","E","handleUploadEvent","willProcessFiles","queueItemId","speed","totalBytes","completedBytes","updateTotalProgress","addError","cancel","activeUpload","validate","failed","errorMessage","updateProgress","completeUpload","msg","showLearnMoreButton","isAdmin","errorUpload","inProgress","UploadsModule","downloadFileFromUrl","click","removeChild","AllowedExtensionsValidation","extension","BlockedExtensionsValidation","WORKSPACE_CONFIG","PERSONAL_WORKSPACE","default","WorkspacesService","cookie","notifications","available$","getIdFromCookie","cookieName","BASE_URI","pushAndSelect","inviteId","roleId","memberId","member_id","clickedOnNotification$","notification","err","handleWorkspaceInviteClickError","deleteInvite","notif"],"mappings":"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","sourceRoot":"webpack:///","sourcesContent":["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 { 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 { ObserversModule } from '@angular/cdk/observers';\nimport { CommonModule } from '@angular/common';\nimport { InjectionToken, Directive, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, Inject, Optional, NgZone, ViewChild, ContentChild, ContentChildren, NgModule } from '@angular/core';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Subject, merge, fromEvent } from 'rxjs';\nimport { startWith, takeUntil, take } from 'rxjs/operators';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { Platform } from '@angular/cdk/platform';\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/bidi';\nimport * as ɵngcc2 from '@angular/cdk/platform';\nimport * as ɵngcc3 from '@angular/common';\nimport * as ɵngcc4 from '@angular/cdk/observers';\n\nconst _c0 = [\"underline\"];\nconst _c1 = [\"connectionContainer\"];\nconst _c2 = [\"inputContainer\"];\nconst _c3 = [\"label\"];\nfunction MatFormField_ng_container_3_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementContainerStart(0);\n    ɵngcc0.ɵɵelementStart(1, \"div\", 14);\n    ɵngcc0.ɵɵelement(2, \"div\", 15);\n    ɵngcc0.ɵɵelement(3, \"div\", 16);\n    ɵngcc0.ɵɵelement(4, \"div\", 17);\n    ɵngcc0.ɵɵelementEnd();\n    ɵngcc0.ɵɵelementStart(5, \"div\", 18);\n    ɵngcc0.ɵɵelement(6, \"div\", 15);\n    ɵngcc0.ɵɵelement(7, \"div\", 16);\n    ɵngcc0.ɵɵelement(8, \"div\", 17);\n    ɵngcc0.ɵɵelementEnd();\n    ɵngcc0.ɵɵelementContainerEnd();\n} }\nfunction MatFormField_div_4_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\", 19);\n    ɵngcc0.ɵɵprojection(1, 1);\n    ɵngcc0.ɵɵelementEnd();\n} }\nfunction MatFormField_label_9_ng_container_2_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementContainerStart(0);\n    ɵngcc0.ɵɵprojection(1, 2);\n    ɵngcc0.ɵɵelementStart(2, \"span\");\n    ɵngcc0.ɵɵtext(3);\n    ɵngcc0.ɵɵelementEnd();\n    ɵngcc0.ɵɵelementContainerEnd();\n} if (rf & 2) {\n    const ctx_r10 = ɵngcc0.ɵɵnextContext(2);\n    ɵngcc0.ɵɵadvance(3);\n    ɵngcc0.ɵɵtextInterpolate(ctx_r10._control.placeholder);\n} }\nfunction MatFormField_label_9_ng_content_3_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵprojection(0, 3, [\"*ngSwitchCase\", \"true\"]);\n} }\nfunction MatFormField_label_9_span_4_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"span\", 23);\n    ɵngcc0.ɵɵtext(1, \" *\");\n    ɵngcc0.ɵɵelementEnd();\n} }\nfunction MatFormField_label_9_Template(rf, ctx) { if (rf & 1) {\n    const _r14 = ɵngcc0.ɵɵgetCurrentView();\n    ɵngcc0.ɵɵelementStart(0, \"label\", 20, 21);\n    ɵngcc0.ɵɵlistener(\"cdkObserveContent\", function MatFormField_label_9_Template_label_cdkObserveContent_0_listener() { ɵngcc0.ɵɵrestoreView(_r14); const ctx_r13 = ɵngcc0.ɵɵnextContext(); return ctx_r13.updateOutlineGap(); });\n    ɵngcc0.ɵɵtemplate(2, MatFormField_label_9_ng_container_2_Template, 4, 1, \"ng-container\", 12);\n    ɵngcc0.ɵɵtemplate(3, MatFormField_label_9_ng_content_3_Template, 1, 0, \"ng-content\", 12);\n    ɵngcc0.ɵɵtemplate(4, MatFormField_label_9_span_4_Template, 2, 0, \"span\", 22);\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r4 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵclassProp(\"mat-empty\", ctx_r4._control.empty && !ctx_r4._shouldAlwaysFloat())(\"mat-form-field-empty\", ctx_r4._control.empty && !ctx_r4._shouldAlwaysFloat())(\"mat-accent\", ctx_r4.color == \"accent\")(\"mat-warn\", ctx_r4.color == \"warn\");\n    ɵngcc0.ɵɵproperty(\"cdkObserveContentDisabled\", ctx_r4.appearance != \"outline\")(\"id\", ctx_r4._labelId)(\"ngSwitch\", ctx_r4._hasLabel());\n    ɵngcc0.ɵɵattribute(\"for\", ctx_r4._control.id)(\"aria-owns\", ctx_r4._control.id);\n    ɵngcc0.ɵɵadvance(2);\n    ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n    ɵngcc0.ɵɵadvance(1);\n    ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n    ɵngcc0.ɵɵadvance(1);\n    ɵngcc0.ɵɵproperty(\"ngIf\", !ctx_r4.hideRequiredMarker && ctx_r4._control.required && !ctx_r4._control.disabled);\n} }\nfunction MatFormField_div_10_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\", 24);\n    ɵngcc0.ɵɵprojection(1, 4);\n    ɵngcc0.ɵɵelementEnd();\n} }\nfunction MatFormField_div_11_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\", 25, 26);\n    ɵngcc0.ɵɵelement(2, \"span\", 27);\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r6 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵadvance(2);\n    ɵngcc0.ɵɵclassProp(\"mat-accent\", ctx_r6.color == \"accent\")(\"mat-warn\", ctx_r6.color == \"warn\");\n} }\nfunction MatFormField_div_13_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\");\n    ɵngcc0.ɵɵprojection(1, 5);\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r7 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵproperty(\"@transitionMessages\", ctx_r7._subscriptAnimationState);\n} }\nfunction MatFormField_div_14_div_1_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\", 31);\n    ɵngcc0.ɵɵtext(1);\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r16 = ɵngcc0.ɵɵnextContext(2);\n    ɵngcc0.ɵɵproperty(\"id\", ctx_r16._hintLabelId);\n    ɵngcc0.ɵɵadvance(1);\n    ɵngcc0.ɵɵtextInterpolate(ctx_r16.hintLabel);\n} }\nfunction MatFormField_div_14_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"div\", 28);\n    ɵngcc0.ɵɵtemplate(1, MatFormField_div_14_div_1_Template, 2, 2, \"div\", 29);\n    ɵngcc0.ɵɵprojection(2, 6);\n    ɵngcc0.ɵɵelement(3, \"div\", 30);\n    ɵngcc0.ɵɵprojection(4, 7);\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r8 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵproperty(\"@transitionMessages\", ctx_r8._subscriptAnimationState);\n    ɵngcc0.ɵɵadvance(1);\n    ɵngcc0.ɵɵproperty(\"ngIf\", ctx_r8.hintLabel);\n} }\nconst _c4 = [\"*\", [[\"\", \"matPrefix\", \"\"]], [[\"mat-placeholder\"]], [[\"mat-label\"]], [[\"\", \"matSuffix\", \"\"]], [[\"mat-error\"]], [[\"mat-hint\", 3, \"align\", \"end\"]], [[\"mat-hint\", \"align\", \"end\"]]];\nconst _c5 = [\"*\", \"[matPrefix]\", \"mat-placeholder\", \"mat-label\", \"[matSuffix]\", \"mat-error\", \"mat-hint:not([align='end'])\", \"mat-hint[align='end']\"];\nlet nextUniqueId = 0;\n/**\n * Injection token that can be used to reference instances of `MatError`. It serves as\n * alternative token to the actual `MatError` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_ERROR = new InjectionToken('MatError');\n/** Single error message to be shown underneath the form field. */\nclass MatError {\n    constructor() {\n        this.id = `mat-error-${nextUniqueId++}`;\n    }\n}\nMatError.ɵfac = function MatError_Factory(t) { return new (t || MatError)(); };\nMatError.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatError, selectors: [[\"mat-error\"]], hostAttrs: [\"role\", \"alert\", 1, \"mat-error\"], hostVars: 1, hostBindings: function MatError_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"id\", ctx.id);\n    } }, inputs: { id: \"id\" }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_ERROR, useExisting: MatError }])] });\nMatError.propDecorators = {\n    id: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatError, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-error',\n                host: {\n                    'class': 'mat-error',\n                    'role': 'alert',\n                    '[attr.id]': 'id'\n                },\n                providers: [{ provide: MAT_ERROR, useExisting: MatError }]\n            }]\n    }], function () { return []; }, { id: [{\n            type: Input\n        }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Animations used by the MatFormField.\n * @docs-private\n */\nconst matFormFieldAnimations = {\n    /** Animation that transitions the form field's error and hint messages. */\n    transitionMessages: trigger('transitionMessages', [\n        // TODO(mmalerba): Use angular animations for label animation as well.\n        state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),\n        transition('void => enter', [\n            style({ opacity: 0, transform: 'translateY(-5px)' }),\n            animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)'),\n        ]),\n    ])\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** An interface which allows a control to work inside of a `MatFormField`. */\nclass MatFormFieldControl {\n}\nMatFormFieldControl.ɵfac = function MatFormFieldControl_Factory(t) { return new (t || MatFormFieldControl)(); };\nMatFormFieldControl.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatFormFieldControl });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatFormFieldControl, [{\n        type: Directive\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/** @docs-private */\nfunction getMatFormFieldPlaceholderConflictError() {\n    return Error('Placeholder attribute and child element were both specified.');\n}\n/** @docs-private */\nfunction getMatFormFieldDuplicatedHintError(align) {\n    return Error(`A hint was already declared for 'align=\"${align}\"'.`);\n}\n/** @docs-private */\nfunction getMatFormFieldMissingControlError() {\n    return Error('mat-form-field must contain a MatFormFieldControl.');\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet nextUniqueId$1 = 0;\n/**\n * Injection token that can be used to reference instances of `MatHint`. It serves as\n * alternative token to the actual `MatHint` class which could cause unnecessary\n * retention of the class and its directive metadata.\n *\n * *Note*: This is not part of the public API as the MDC-based form-field will not\n * need a lightweight token for `MatHint` and we want to reduce breaking changes.\n */\nconst _MAT_HINT = new InjectionToken('MatHint');\n/** Hint text to be shown underneath the form field control. */\nclass MatHint {\n    constructor() {\n        /** Whether to align the hint label at the start or end of the line. */\n        this.align = 'start';\n        /** Unique ID for the hint. Used for the aria-describedby on the form field control. */\n        this.id = `mat-hint-${nextUniqueId$1++}`;\n    }\n}\nMatHint.ɵfac = function MatHint_Factory(t) { return new (t || MatHint)(); };\nMatHint.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatHint, selectors: [[\"mat-hint\"]], hostAttrs: [1, \"mat-hint\"], hostVars: 4, hostBindings: function MatHint_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"id\", ctx.id)(\"align\", null);\n        ɵngcc0.ɵɵclassProp(\"mat-form-field-hint-end\", ctx.align === \"end\");\n    } }, inputs: { align: \"align\", id: \"id\" }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: _MAT_HINT, useExisting: MatHint }])] });\nMatHint.propDecorators = {\n    align: [{ type: Input }],\n    id: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatHint, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-hint',\n                host: {\n                    'class': 'mat-hint',\n                    '[class.mat-form-field-hint-end]': 'align === \"end\"',\n                    '[attr.id]': 'id',\n                    // Remove align attribute to prevent it from interfering with layout.\n                    '[attr.align]': 'null'\n                },\n                providers: [{ provide: _MAT_HINT, useExisting: MatHint }]\n            }]\n    }], function () { return []; }, { align: [{\n            type: Input\n        }], id: [{\n            type: Input\n        }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** The floating label for a `mat-form-field`. */\nclass MatLabel {\n}\nMatLabel.ɵfac = function MatLabel_Factory(t) { return new (t || MatLabel)(); };\nMatLabel.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatLabel, selectors: [[\"mat-label\"]] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatLabel, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-label'\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 placeholder text for an `MatFormField`.\n * @deprecated Use `<mat-label>` to specify the label and the `placeholder` attribute to specify the\n *     placeholder.\n * @breaking-change 8.0.0\n */\nclass MatPlaceholder {\n}\nMatPlaceholder.ɵfac = function MatPlaceholder_Factory(t) { return new (t || MatPlaceholder)(); };\nMatPlaceholder.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatPlaceholder, selectors: [[\"mat-placeholder\"]] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatPlaceholder, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-placeholder'\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 * Injection token that can be used to reference instances of `MatPrefix`. It serves as\n * alternative token to the actual `MatPrefix` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_PREFIX = new InjectionToken('MatPrefix');\n/** Prefix to be placed in front of the form field. */\nclass MatPrefix {\n}\nMatPrefix.ɵfac = function MatPrefix_Factory(t) { return new (t || MatPrefix)(); };\nMatPrefix.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatPrefix, selectors: [[\"\", \"matPrefix\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_PREFIX, useExisting: MatPrefix }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatPrefix, [{\n        type: Directive,\n        args: [{\n                selector: '[matPrefix]',\n                providers: [{ provide: MAT_PREFIX, useExisting: MatPrefix }]\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 * Injection token that can be used to reference instances of `MatSuffix`. It serves as\n * alternative token to the actual `MatSuffix` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nconst MAT_SUFFIX = new InjectionToken('MatSuffix');\n/** Suffix to be placed at the end of the form field. */\nclass MatSuffix {\n}\nMatSuffix.ɵfac = function MatSuffix_Factory(t) { return new (t || MatSuffix)(); };\nMatSuffix.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatSuffix, selectors: [[\"\", \"matSuffix\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: MAT_SUFFIX, useExisting: MatSuffix }])] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSuffix, [{\n        type: Directive,\n        args: [{\n                selector: '[matSuffix]',\n                providers: [{ provide: MAT_SUFFIX, useExisting: MatSuffix }]\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 */\nlet nextUniqueId$2 = 0;\nconst floatingLabelScale = 0.75;\nconst outlineGapPadding = 5;\n/**\n * Boilerplate for applying mixins to MatFormField.\n * @docs-private\n */\nclass MatFormFieldBase {\n    constructor(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n}\n/**\n * Base class to which we're applying the form field mixins.\n * @docs-private\n */\nconst _MatFormFieldMixinBase = mixinColor(MatFormFieldBase, 'primary');\n/**\n * Injection token that can be used to configure the\n * default options for all form field within an app.\n */\nconst MAT_FORM_FIELD_DEFAULT_OPTIONS = new InjectionToken('MAT_FORM_FIELD_DEFAULT_OPTIONS');\n/**\n * Injection token that can be used to inject an instances of `MatFormField`. It serves\n * as alternative token to the actual `MatFormField` class which would cause unnecessary\n * retention of the `MatFormField` class and its component metadata.\n */\nconst MAT_FORM_FIELD = new InjectionToken('MatFormField');\n/** Container for form controls that applies Material Design styling and behavior. */\nclass MatFormField extends _MatFormFieldMixinBase {\n    constructor(_elementRef, _changeDetectorRef, \n    /**\n     * @deprecated `_labelOptions` parameter no longer being used. To be removed.\n     * @breaking-change 12.0.0\n     */\n    // Use `ElementRef` here so Angular has something to inject.\n    _labelOptions, _dir, _defaults, _platform, _ngZone, _animationMode) {\n        super(_elementRef);\n        this._elementRef = _elementRef;\n        this._changeDetectorRef = _changeDetectorRef;\n        this._dir = _dir;\n        this._defaults = _defaults;\n        this._platform = _platform;\n        this._ngZone = _ngZone;\n        /**\n         * Whether the outline gap needs to be calculated\n         * immediately on the next change detection run.\n         */\n        this._outlineGapCalculationNeededImmediately = false;\n        /** Whether the outline gap needs to be calculated next time the zone has stabilized. */\n        this._outlineGapCalculationNeededOnStable = false;\n        this._destroyed = new Subject();\n        /** Override for the logic that disables the label animation in certain cases. */\n        this._showAlwaysAnimate = false;\n        /** State of the mat-hint and mat-error animations. */\n        this._subscriptAnimationState = '';\n        this._hintLabel = '';\n        // Unique id for the hint label.\n        this._hintLabelId = `mat-hint-${nextUniqueId$2++}`;\n        // Unique id for the label element.\n        this._labelId = `mat-form-field-label-${nextUniqueId$2++}`;\n        this.floatLabel = this._getDefaultFloatLabelState();\n        this._animationsEnabled = _animationMode !== 'NoopAnimations';\n        // Set the default through here so we invoke the setter on the first run.\n        this.appearance = (_defaults && _defaults.appearance) ? _defaults.appearance : 'legacy';\n        this._hideRequiredMarker = (_defaults && _defaults.hideRequiredMarker != null) ?\n            _defaults.hideRequiredMarker : false;\n    }\n    /** The form-field appearance style. */\n    get appearance() { return this._appearance; }\n    set appearance(value) {\n        const oldValue = this._appearance;\n        this._appearance = value || (this._defaults && this._defaults.appearance) || 'legacy';\n        if (this._appearance === 'outline' && oldValue !== value) {\n            this._outlineGapCalculationNeededOnStable = true;\n        }\n    }\n    /** Whether the required marker should be hidden. */\n    get hideRequiredMarker() { return this._hideRequiredMarker; }\n    set hideRequiredMarker(value) {\n        this._hideRequiredMarker = coerceBooleanProperty(value);\n    }\n    /** Whether the floating label should always float or not. */\n    _shouldAlwaysFloat() {\n        return this.floatLabel === 'always' && !this._showAlwaysAnimate;\n    }\n    /** Whether the label can float or not. */\n    _canLabelFloat() { return this.floatLabel !== 'never'; }\n    /** Text for the form field hint. */\n    get hintLabel() { return this._hintLabel; }\n    set hintLabel(value) {\n        this._hintLabel = value;\n        this._processHints();\n    }\n    /**\n     * Whether the label should always float, never float or float as the user types.\n     *\n     * Note: only the legacy appearance supports the `never` option. `never` was originally added as a\n     * way to make the floating label emulate the behavior of a standard input placeholder. However\n     * the form field now supports both floating labels and placeholders. Therefore in the non-legacy\n     * appearances the `never` option has been disabled in favor of just using the placeholder.\n     */\n    get floatLabel() {\n        return this.appearance !== 'legacy' && this._floatLabel === 'never' ? 'auto' : this._floatLabel;\n    }\n    set floatLabel(value) {\n        if (value !== this._floatLabel) {\n            this._floatLabel = value || this._getDefaultFloatLabelState();\n            this._changeDetectorRef.markForCheck();\n        }\n    }\n    get _control() {\n        // TODO(crisbeto): we need this workaround in order to support both Ivy and ViewEngine.\n        //  We should clean this up once Ivy is the default renderer.\n        return this._explicitFormFieldControl || this._controlNonStatic || this._controlStatic;\n    }\n    set _control(value) {\n        this._explicitFormFieldControl = value;\n    }\n    /**\n     * Gets the id of the label element. If no label is present, returns `null`.\n     */\n    getLabelId() {\n        return this._hasFloatingLabel() ? this._labelId : null;\n    }\n    /**\n     * Gets an ElementRef for the element that a overlay attached to the form-field should be\n     * positioned relative to.\n     */\n    getConnectedOverlayOrigin() {\n        return this._connectionContainerRef || this._elementRef;\n    }\n    ngAfterContentInit() {\n        this._validateControlChild();\n        const control = this._control;\n        if (control.controlType) {\n            this._elementRef.nativeElement.classList.add(`mat-form-field-type-${control.controlType}`);\n        }\n        // Subscribe to changes in the child control state in order to update the form field UI.\n        control.stateChanges.pipe(startWith(null)).subscribe(() => {\n            this._validatePlaceholders();\n            this._syncDescribedByIds();\n            this._changeDetectorRef.markForCheck();\n        });\n        // Run change detection if the value changes.\n        if (control.ngControl && control.ngControl.valueChanges) {\n            control.ngControl.valueChanges\n                .pipe(takeUntil(this._destroyed))\n                .subscribe(() => this._changeDetectorRef.markForCheck());\n        }\n        // Note that we have to run outside of the `NgZone` explicitly,\n        // in order to avoid throwing users into an infinite loop\n        // if `zone-patch-rxjs` is included.\n        this._ngZone.runOutsideAngular(() => {\n            this._ngZone.onStable.pipe(takeUntil(this._destroyed)).subscribe(() => {\n                if (this._outlineGapCalculationNeededOnStable) {\n                    this.updateOutlineGap();\n                }\n            });\n        });\n        // Run change detection and update the outline if the suffix or prefix changes.\n        merge(this._prefixChildren.changes, this._suffixChildren.changes).subscribe(() => {\n            this._outlineGapCalculationNeededOnStable = true;\n            this._changeDetectorRef.markForCheck();\n        });\n        // Re-validate when the number of hints changes.\n        this._hintChildren.changes.pipe(startWith(null)).subscribe(() => {\n            this._processHints();\n            this._changeDetectorRef.markForCheck();\n        });\n        // Update the aria-described by when the number of errors changes.\n        this._errorChildren.changes.pipe(startWith(null)).subscribe(() => {\n            this._syncDescribedByIds();\n            this._changeDetectorRef.markForCheck();\n        });\n        if (this._dir) {\n            this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {\n                if (typeof requestAnimationFrame === 'function') {\n                    this._ngZone.runOutsideAngular(() => {\n                        requestAnimationFrame(() => this.updateOutlineGap());\n                    });\n                }\n                else {\n                    this.updateOutlineGap();\n                }\n            });\n        }\n    }\n    ngAfterContentChecked() {\n        this._validateControlChild();\n        if (this._outlineGapCalculationNeededImmediately) {\n            this.updateOutlineGap();\n        }\n    }\n    ngAfterViewInit() {\n        // Avoid animations on load.\n        this._subscriptAnimationState = 'enter';\n        this._changeDetectorRef.detectChanges();\n    }\n    ngOnDestroy() {\n        this._destroyed.next();\n        this._destroyed.complete();\n    }\n    /** Determines whether a class from the NgControl should be forwarded to the host element. */\n    _shouldForward(prop) {\n        const ngControl = this._control ? this._control.ngControl : null;\n        return ngControl && ngControl[prop];\n    }\n    _hasPlaceholder() {\n        return !!(this._control && this._control.placeholder || this._placeholderChild);\n    }\n    _hasLabel() {\n        return !!(this._labelChildNonStatic || this._labelChildStatic);\n    }\n    _shouldLabelFloat() {\n        return this._canLabelFloat() &&\n            ((this._control && this._control.shouldLabelFloat) || this._shouldAlwaysFloat());\n    }\n    _hideControlPlaceholder() {\n        // In the legacy appearance the placeholder is promoted to a label if no label is given.\n        return this.appearance === 'legacy' && !this._hasLabel() ||\n            this._hasLabel() && !this._shouldLabelFloat();\n    }\n    _hasFloatingLabel() {\n        // In the legacy appearance the placeholder is promoted to a label if no label is given.\n        return this._hasLabel() || this.appearance === 'legacy' && this._hasPlaceholder();\n    }\n    /** Determines whether to display hints or errors. */\n    _getDisplayedMessages() {\n        return (this._errorChildren && this._errorChildren.length > 0 &&\n            this._control.errorState) ? 'error' : 'hint';\n    }\n    /** Animates the placeholder up and locks it in position. */\n    _animateAndLockLabel() {\n        if (this._hasFloatingLabel() && this._canLabelFloat()) {\n            // If animations are disabled, we shouldn't go in here,\n            // because the `transitionend` will never fire.\n            if (this._animationsEnabled && this._label) {\n                this._showAlwaysAnimate = true;\n                fromEvent(this._label.nativeElement, 'transitionend').pipe(take(1)).subscribe(() => {\n                    this._showAlwaysAnimate = false;\n                });\n            }\n            this.floatLabel = 'always';\n            this._changeDetectorRef.markForCheck();\n        }\n    }\n    /**\n     * Ensure that there is only one placeholder (either `placeholder` attribute on the child control\n     * or child element with the `mat-placeholder` directive).\n     */\n    _validatePlaceholders() {\n        if (this._control.placeholder && this._placeholderChild &&\n            (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getMatFormFieldPlaceholderConflictError();\n        }\n    }\n    /** Does any extra processing that is required when handling the hints. */\n    _processHints() {\n        this._validateHints();\n        this._syncDescribedByIds();\n    }\n    /**\n     * Ensure that there is a maximum of one of each `<mat-hint>` alignment specified, with the\n     * attribute being considered as `align=\"start\"`.\n     */\n    _validateHints() {\n        if (this._hintChildren && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            let startHint;\n            let endHint;\n            this._hintChildren.forEach((hint) => {\n                if (hint.align === 'start') {\n                    if (startHint || this.hintLabel) {\n                        throw getMatFormFieldDuplicatedHintError('start');\n                    }\n                    startHint = hint;\n                }\n                else if (hint.align === 'end') {\n                    if (endHint) {\n                        throw getMatFormFieldDuplicatedHintError('end');\n                    }\n                    endHint = hint;\n                }\n            });\n        }\n    }\n    /** Gets the default float label state. */\n    _getDefaultFloatLabelState() {\n        return (this._defaults && this._defaults.floatLabel) || 'auto';\n    }\n    /**\n     * Sets the list of element IDs that describe the child control. This allows the control to update\n     * its `aria-describedby` attribute accordingly.\n     */\n    _syncDescribedByIds() {\n        if (this._control) {\n            let ids = [];\n            // TODO(wagnermaciel): Remove the type check when we find the root cause of this bug.\n            if (this._control.userAriaDescribedBy &&\n                typeof this._control.userAriaDescribedBy === 'string') {\n                ids.push(...this._control.userAriaDescribedBy.split(' '));\n            }\n            if (this._getDisplayedMessages() === 'hint') {\n                const startHint = this._hintChildren ?\n                    this._hintChildren.find(hint => hint.align === 'start') : null;\n                const endHint = this._hintChildren ?\n                    this._hintChildren.find(hint => hint.align === 'end') : null;\n                if (startHint) {\n                    ids.push(startHint.id);\n                }\n                else if (this._hintLabel) {\n                    ids.push(this._hintLabelId);\n                }\n                if (endHint) {\n                    ids.push(endHint.id);\n                }\n            }\n            else if (this._errorChildren) {\n                ids.push(...this._errorChildren.map(error => error.id));\n            }\n            this._control.setDescribedByIds(ids);\n        }\n    }\n    /** Throws an error if the form field's control is missing. */\n    _validateControlChild() {\n        if (!this._control && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getMatFormFieldMissingControlError();\n        }\n    }\n    /**\n     * Updates the width and position of the gap in the outline. Only relevant for the outline\n     * appearance.\n     */\n    updateOutlineGap() {\n        const labelEl = this._label ? this._label.nativeElement : null;\n        if (this.appearance !== 'outline' || !labelEl || !labelEl.children.length ||\n            !labelEl.textContent.trim()) {\n            return;\n        }\n        if (!this._platform.isBrowser) {\n            // getBoundingClientRect isn't available on the server.\n            return;\n        }\n        // If the element is not present in the DOM, the outline gap will need to be calculated\n        // the next time it is checked and in the DOM.\n        if (!this._isAttachedToDOM()) {\n            this._outlineGapCalculationNeededImmediately = true;\n            return;\n        }\n        let startWidth = 0;\n        let gapWidth = 0;\n        const container = this._connectionContainerRef.nativeElement;\n        const startEls = container.querySelectorAll('.mat-form-field-outline-start');\n        const gapEls = container.querySelectorAll('.mat-form-field-outline-gap');\n        if (this._label && this._label.nativeElement.children.length) {\n            const containerRect = container.getBoundingClientRect();\n            // If the container's width and height are zero, it means that the element is\n            // invisible and we can't calculate the outline gap. Mark the element as needing\n            // to be checked the next time the zone stabilizes. We can't do this immediately\n            // on the next change detection, because even if the element becomes visible,\n            // the `ClientRect` won't be reclaculated immediately. We reset the\n            // `_outlineGapCalculationNeededImmediately` flag some we don't run the checks twice.\n            if (containerRect.width === 0 && containerRect.height === 0) {\n                this._outlineGapCalculationNeededOnStable = true;\n                this._outlineGapCalculationNeededImmediately = false;\n                return;\n            }\n            const containerStart = this._getStartEnd(containerRect);\n            const labelChildren = labelEl.children;\n            const labelStart = this._getStartEnd(labelChildren[0].getBoundingClientRect());\n            let labelWidth = 0;\n            for (let i = 0; i < labelChildren.length; i++) {\n                labelWidth += labelChildren[i].offsetWidth;\n            }\n            startWidth = Math.abs(labelStart - containerStart) - outlineGapPadding;\n            gapWidth = labelWidth > 0 ? labelWidth * floatingLabelScale + outlineGapPadding * 2 : 0;\n        }\n        for (let i = 0; i < startEls.length; i++) {\n            startEls[i].style.width = `${startWidth}px`;\n        }\n        for (let i = 0; i < gapEls.length; i++) {\n            gapEls[i].style.width = `${gapWidth}px`;\n        }\n        this._outlineGapCalculationNeededOnStable =\n            this._outlineGapCalculationNeededImmediately = false;\n    }\n    /** Gets the start end of the rect considering the current directionality. */\n    _getStartEnd(rect) {\n        return (this._dir && this._dir.value === 'rtl') ? rect.right : rect.left;\n    }\n    /** Checks whether the form field is attached to the DOM. */\n    _isAttachedToDOM() {\n        const element = this._elementRef.nativeElement;\n        if (element.getRootNode) {\n            const rootNode = element.getRootNode();\n            // If the element is inside the DOM the root node will be either the document\n            // or the closest shadow root, otherwise it'll be the element itself.\n            return rootNode && rootNode !== element;\n        }\n        // Otherwise fall back to checking if it's in the document. This doesn't account for\n        // shadow DOM, however browser that support shadow DOM should support `getRootNode` as well.\n        return document.documentElement.contains(element);\n    }\n}\nMatFormField.ɵfac = function MatFormField_Factory(t) { return new (t || MatFormField)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(MAT_FORM_FIELD_DEFAULT_OPTIONS, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.Platform), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatFormField.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatFormField, selectors: [[\"mat-form-field\"]], contentQueries: function MatFormField_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatFormFieldControl, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatFormFieldControl, 7);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatLabel, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatLabel, 7);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatPlaceholder, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_ERROR, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, _MAT_HINT, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_PREFIX, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MAT_SUFFIX, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._controlNonStatic = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._controlStatic = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._labelChildNonStatic = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._labelChildStatic = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._placeholderChild = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._errorChildren = _t);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._hintChildren = _t);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._prefixChildren = _t);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._suffixChildren = _t);\n    } }, viewQuery: function MatFormField_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(_c0, 5);\n        ɵngcc0.ɵɵviewQuery(_c1, 7);\n        ɵngcc0.ɵɵviewQuery(_c2, 5);\n        ɵngcc0.ɵɵviewQuery(_c3, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.underlineRef = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._connectionContainerRef = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._inputContainerRef = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._label = _t.first);\n    } }, hostAttrs: [1, \"mat-form-field\"], hostVars: 40, hostBindings: function MatFormField_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵclassProp(\"mat-form-field-appearance-standard\", ctx.appearance == \"standard\")(\"mat-form-field-appearance-fill\", ctx.appearance == \"fill\")(\"mat-form-field-appearance-outline\", ctx.appearance == \"outline\")(\"mat-form-field-appearance-legacy\", ctx.appearance == \"legacy\")(\"mat-form-field-invalid\", ctx._control.errorState)(\"mat-form-field-can-float\", ctx._canLabelFloat())(\"mat-form-field-should-float\", ctx._shouldLabelFloat())(\"mat-form-field-has-label\", ctx._hasFloatingLabel())(\"mat-form-field-hide-placeholder\", ctx._hideControlPlaceholder())(\"mat-form-field-disabled\", ctx._control.disabled)(\"mat-form-field-autofilled\", ctx._control.autofilled)(\"mat-focused\", ctx._control.focused)(\"ng-untouched\", ctx._shouldForward(\"untouched\"))(\"ng-touched\", ctx._shouldForward(\"touched\"))(\"ng-pristine\", ctx._shouldForward(\"pristine\"))(\"ng-dirty\", ctx._shouldForward(\"dirty\"))(\"ng-valid\", ctx._shouldForward(\"valid\"))(\"ng-invalid\", ctx._shouldForward(\"invalid\"))(\"ng-pending\", ctx._shouldForward(\"pending\"))(\"_mat-animation-noopable\", !ctx._animationsEnabled);\n    } }, inputs: { color: \"color\", floatLabel: \"floatLabel\", appearance: \"appearance\", hideRequiredMarker: \"hideRequiredMarker\", hintLabel: \"hintLabel\" }, exportAs: [\"matFormField\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            { provide: MAT_FORM_FIELD, useExisting: MatFormField },\n        ]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c5, decls: 15, vars: 8, consts: [[1, \"mat-form-field-wrapper\"], [1, \"mat-form-field-flex\", 3, \"click\"], [\"connectionContainer\", \"\"], [4, \"ngIf\"], [\"class\", \"mat-form-field-prefix\", 4, \"ngIf\"], [1, \"mat-form-field-infix\"], [\"inputContainer\", \"\"], [1, \"mat-form-field-label-wrapper\"], [\"class\", \"mat-form-field-label\", 3, \"cdkObserveContentDisabled\", \"id\", \"mat-empty\", \"mat-form-field-empty\", \"mat-accent\", \"mat-warn\", \"ngSwitch\", \"cdkObserveContent\", 4, \"ngIf\"], [\"class\", \"mat-form-field-suffix\", 4, \"ngIf\"], [\"class\", \"mat-form-field-underline\", 4, \"ngIf\"], [1, \"mat-form-field-subscript-wrapper\", 3, \"ngSwitch\"], [4, \"ngSwitchCase\"], [\"class\", \"mat-form-field-hint-wrapper\", 4, \"ngSwitchCase\"], [1, \"mat-form-field-outline\"], [1, \"mat-form-field-outline-start\"], [1, \"mat-form-field-outline-gap\"], [1, \"mat-form-field-outline-end\"], [1, \"mat-form-field-outline\", \"mat-form-field-outline-thick\"], [1, \"mat-form-field-prefix\"], [1, \"mat-form-field-label\", 3, \"cdkObserveContentDisabled\", \"id\", \"ngSwitch\", \"cdkObserveContent\"], [\"label\", \"\"], [\"class\", \"mat-placeholder-required mat-form-field-required-marker\", \"aria-hidden\", \"true\", 4, \"ngIf\"], [\"aria-hidden\", \"true\", 1, \"mat-placeholder-required\", \"mat-form-field-required-marker\"], [1, \"mat-form-field-suffix\"], [1, \"mat-form-field-underline\"], [\"underline\", \"\"], [1, \"mat-form-field-ripple\"], [1, \"mat-form-field-hint-wrapper\"], [\"class\", \"mat-hint\", 3, \"id\", 4, \"ngIf\"], [1, \"mat-form-field-hint-spacer\"], [1, \"mat-hint\", 3, \"id\"]], template: function MatFormField_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef(_c4);\n        ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n        ɵngcc0.ɵɵelementStart(1, \"div\", 1, 2);\n        ɵngcc0.ɵɵlistener(\"click\", function MatFormField_Template_div_click_1_listener($event) { return ctx._control.onContainerClick && ctx._control.onContainerClick($event); });\n        ɵngcc0.ɵɵtemplate(3, MatFormField_ng_container_3_Template, 9, 0, \"ng-container\", 3);\n        ɵngcc0.ɵɵtemplate(4, MatFormField_div_4_Template, 2, 0, \"div\", 4);\n        ɵngcc0.ɵɵelementStart(5, \"div\", 5, 6);\n        ɵngcc0.ɵɵprojection(7);\n        ɵngcc0.ɵɵelementStart(8, \"span\", 7);\n        ɵngcc0.ɵɵtemplate(9, MatFormField_label_9_Template, 5, 16, \"label\", 8);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵtemplate(10, MatFormField_div_10_Template, 2, 0, \"div\", 9);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵtemplate(11, MatFormField_div_11_Template, 3, 4, \"div\", 10);\n        ɵngcc0.ɵɵelementStart(12, \"div\", 11);\n        ɵngcc0.ɵɵtemplate(13, MatFormField_div_13_Template, 2, 1, \"div\", 12);\n        ɵngcc0.ɵɵtemplate(14, MatFormField_div_14_Template, 5, 2, \"div\", 13);\n        ɵngcc0.ɵɵelementEnd();\n        ɵngcc0.ɵɵelementEnd();\n    } if (rf & 2) {\n        ɵngcc0.ɵɵadvance(3);\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx.appearance == \"outline\");\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx._prefixChildren.length);\n        ɵngcc0.ɵɵadvance(5);\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx._hasFloatingLabel());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx._suffixChildren.length);\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx.appearance != \"outline\");\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx._getDisplayedMessages());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"error\");\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitchCase\", \"hint\");\n    } }, directives: [ɵngcc3.NgIf, ɵngcc3.NgSwitch, ɵngcc3.NgSwitchCase, ɵngcc4.CdkObserveContent], styles: [\".mat-form-field{display:inline-block;position:relative;text-align:left}[dir=rtl] .mat-form-field{text-align:right}.mat-form-field-wrapper{position:relative}.mat-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-form-field-prefix,.mat-form-field-suffix{white-space:nowrap;flex:none;position:relative}.mat-form-field-infix{display:block;position:relative;flex:auto;min-width:0;width:180px}.cdk-high-contrast-active .mat-form-field-infix{border-image:linear-gradient(transparent, transparent)}.mat-form-field-label-wrapper{position:absolute;left:0;box-sizing:content-box;width:100%;height:100%;overflow:hidden;pointer-events:none}[dir=rtl] .mat-form-field-label-wrapper{left:auto;right:0}.mat-form-field-label{position:absolute;left:0;font:inherit;pointer-events:none;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),width 400ms cubic-bezier(0.25, 0.8, 0.25, 1);display:none}[dir=rtl] .mat-form-field-label{transform-origin:100% 0;left:auto;right:0}.mat-form-field-empty.mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{display:block}.mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:block;transition:none}.mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float .mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:block}.mat-form-field-label:not(.mat-form-field-empty){transition:none}.mat-form-field-underline{position:absolute;width:100%;pointer-events:none;transform:scale3d(1, 1.0001, 1)}.mat-form-field-ripple{position:absolute;left:0;width:100%;transform-origin:50%;transform:scaleX(0.5);opacity:0;transition:background-color 300ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-form-field.mat-focused .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple{opacity:1;transform:none;transition:transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 300ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-subscript-wrapper{position:absolute;box-sizing:border-box;width:100%;overflow:hidden}.mat-form-field-subscript-wrapper .mat-icon,.mat-form-field-label-wrapper .mat-icon{width:1em;height:1em;font-size:inherit;vertical-align:baseline}.mat-form-field-hint-wrapper{display:flex}.mat-form-field-hint-spacer{flex:1 0 1em}.mat-error{display:block}.mat-form-field-control-wrapper{position:relative}.mat-form-field-hint-end{order:1}.mat-form-field._mat-animation-noopable .mat-form-field-label,.mat-form-field._mat-animation-noopable .mat-form-field-ripple{transition:none}\\n\", \".mat-form-field-appearance-fill .mat-form-field-flex{border-radius:4px 4px 0 0;padding:.75em .75em 0 .75em}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-flex{outline:solid 1px}.mat-form-field-appearance-fill .mat-form-field-underline::before{content:\\\"\\\";display:block;position:absolute;bottom:0;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-fill:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-fill._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}.mat-form-field-appearance-fill .mat-form-field-subscript-wrapper{padding:0 1em}\\n\", \".mat-input-element{font:inherit;background:transparent;color:currentColor;border:none;outline:none;padding:0;margin:0;width:100%;max-width:100%;vertical-align:bottom;text-align:inherit;box-sizing:content-box}.mat-input-element:-moz-ui-invalid{box-shadow:none}.mat-input-element::-ms-clear,.mat-input-element::-ms-reveal{display:none}.mat-input-element,.mat-input-element::-webkit-search-cancel-button,.mat-input-element::-webkit-search-decoration,.mat-input-element::-webkit-search-results-button,.mat-input-element::-webkit-search-results-decoration{-webkit-appearance:none}.mat-input-element::-webkit-contacts-auto-fill-button,.mat-input-element::-webkit-caps-lock-indicator,.mat-input-element::-webkit-credentials-auto-fill-button{visibility:hidden}.mat-input-element[type=date],.mat-input-element[type=datetime],.mat-input-element[type=datetime-local],.mat-input-element[type=month],.mat-input-element[type=week],.mat-input-element[type=time]{line-height:1}.mat-input-element[type=date]::after,.mat-input-element[type=datetime]::after,.mat-input-element[type=datetime-local]::after,.mat-input-element[type=month]::after,.mat-input-element[type=week]::after,.mat-input-element[type=time]::after{content:\\\" \\\";white-space:pre;width:1px}.mat-input-element::-webkit-inner-spin-button,.mat-input-element::-webkit-calendar-picker-indicator,.mat-input-element::-webkit-clear-button{font-size:.75em}.mat-input-element::placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-moz-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-moz-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-webkit-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-webkit-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element:-ms-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element:-ms-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-form-field-hide-placeholder .mat-input-element::placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-moz-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-webkit-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element:-ms-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}textarea.mat-input-element{resize:vertical;overflow:auto}textarea.mat-input-element.cdk-textarea-autosize{resize:none}textarea.mat-input-element{padding:2px 0;margin:-2px 0}select.mat-input-element{-moz-appearance:none;-webkit-appearance:none;position:relative;background-color:transparent;display:inline-flex;box-sizing:border-box;padding-top:1em;top:-1em;margin-bottom:-1em}select.mat-input-element::-ms-expand{display:none}select.mat-input-element::-moz-focus-inner{border:0}select.mat-input-element:not(:disabled){cursor:pointer}select.mat-input-element::-ms-value{color:inherit;background:none}.mat-focused .cdk-high-contrast-active select.mat-input-element::-ms-value{color:inherit}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{content:\\\"\\\";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;position:absolute;top:50%;right:0;margin-top:-2.5px;pointer-events:none}[dir=rtl] .mat-form-field-type-mat-native-select .mat-form-field-infix::after{right:auto;left:0}.mat-form-field-type-mat-native-select .mat-input-element{padding-right:15px}[dir=rtl] .mat-form-field-type-mat-native-select .mat-input-element{padding-right:0;padding-left:15px}.mat-form-field-type-mat-native-select .mat-form-field-label-wrapper{max-width:calc(100% - 10px)}.mat-form-field-type-mat-native-select.mat-form-field-appearance-outline .mat-form-field-infix::after{margin-top:-5px}.mat-form-field-type-mat-native-select.mat-form-field-appearance-fill .mat-form-field-infix::after{margin-top:-10px}\\n\", \".mat-form-field-appearance-legacy .mat-form-field-label{transform:perspective(100px);-ms-transform:none}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon{width:1em}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button{font:inherit;vertical-align:baseline}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button .mat-icon{font-size:inherit}.mat-form-field-appearance-legacy .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-legacy .mat-form-field-ripple{top:0;height:2px;overflow:hidden}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-legacy.mat-form-field-invalid:not(.mat-focused) .mat-form-field-ripple{height:1px}\\n\", \".mat-form-field-appearance-outline .mat-form-field-wrapper{margin:.25em 0}.mat-form-field-appearance-outline .mat-form-field-flex{padding:0 .75em 0 .75em;margin-top:-0.25em;position:relative}.mat-form-field-appearance-outline .mat-form-field-prefix,.mat-form-field-appearance-outline .mat-form-field-suffix{top:.25em}.mat-form-field-appearance-outline .mat-form-field-outline{display:flex;position:absolute;top:.25em;left:0;right:0;bottom:0;pointer-events:none}.mat-form-field-appearance-outline .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-end{border:1px solid currentColor;min-width:5px}.mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:5px 0 0 5px;border-right-style:none}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-start{border-right-style:solid;border-left-style:none;border-radius:0 5px 5px 0}.mat-form-field-appearance-outline .mat-form-field-outline-end{border-radius:0 5px 5px 0;border-left-style:none;flex-grow:1}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-end{border-left-style:solid;border-right-style:none;border-radius:5px 0 0 5px}.mat-form-field-appearance-outline .mat-form-field-outline-gap{border-radius:.000001px;border:1px solid currentColor;border-left-style:none;border-right-style:none}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-outline-gap{border-top-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline-thick{opacity:0}.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-end,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:2px}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline{opacity:0;transition:opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline{opacity:0;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline .mat-form-field-subscript-wrapper{padding:0 1em}.mat-form-field-appearance-outline._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-start,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-end,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-gap{transition:none}\\n\", \".mat-form-field-appearance-standard .mat-form-field-flex{padding-top:.75em}.mat-form-field-appearance-standard .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-standard .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-standard:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-standard._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}\\n\"], encapsulation: 2, data: { animation: [matFormFieldAnimations.transitionMessages] }, changeDetection: 0 });\nMatFormField.ctorParameters = () => [\n    { type: ElementRef },\n    { type: ChangeDetectorRef },\n    { type: undefined, decorators: [{ type: Inject, args: [ElementRef,] }] },\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD_DEFAULT_OPTIONS,] }] },\n    { type: Platform },\n    { type: NgZone },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatFormField.propDecorators = {\n    appearance: [{ type: Input }],\n    hideRequiredMarker: [{ type: Input }],\n    hintLabel: [{ type: Input }],\n    floatLabel: [{ type: Input }],\n    underlineRef: [{ type: ViewChild, args: ['underline',] }],\n    _connectionContainerRef: [{ type: ViewChild, args: ['connectionContainer', { static: true },] }],\n    _inputContainerRef: [{ type: ViewChild, args: ['inputContainer',] }],\n    _label: [{ type: ViewChild, args: ['label',] }],\n    _controlNonStatic: [{ type: ContentChild, args: [MatFormFieldControl,] }],\n    _controlStatic: [{ type: ContentChild, args: [MatFormFieldControl, { static: true },] }],\n    _labelChildNonStatic: [{ type: ContentChild, args: [MatLabel,] }],\n    _labelChildStatic: [{ type: ContentChild, args: [MatLabel, { static: true },] }],\n    _placeholderChild: [{ type: ContentChild, args: [MatPlaceholder,] }],\n    _errorChildren: [{ type: ContentChildren, args: [MAT_ERROR, { descendants: true },] }],\n    _hintChildren: [{ type: ContentChildren, args: [_MAT_HINT, { descendants: true },] }],\n    _prefixChildren: [{ type: ContentChildren, args: [MAT_PREFIX, { descendants: true },] }],\n    _suffixChildren: [{ type: ContentChildren, args: [MAT_SUFFIX, { descendants: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatFormField, [{\n        type: Component,\n        args: [{\n                selector: 'mat-form-field',\n                exportAs: 'matFormField',\n                template: \"<div class=\\\"mat-form-field-wrapper\\\">\\n  <div class=\\\"mat-form-field-flex\\\" #connectionContainer\\n       (click)=\\\"_control.onContainerClick && _control.onContainerClick($event)\\\">\\n\\n    <!-- Outline used for outline appearance. -->\\n    <ng-container *ngIf=\\\"appearance == 'outline'\\\">\\n      <div class=\\\"mat-form-field-outline\\\">\\n        <div class=\\\"mat-form-field-outline-start\\\"></div>\\n        <div class=\\\"mat-form-field-outline-gap\\\"></div>\\n        <div class=\\\"mat-form-field-outline-end\\\"></div>\\n      </div>\\n      <div class=\\\"mat-form-field-outline mat-form-field-outline-thick\\\">\\n        <div class=\\\"mat-form-field-outline-start\\\"></div>\\n        <div class=\\\"mat-form-field-outline-gap\\\"></div>\\n        <div class=\\\"mat-form-field-outline-end\\\"></div>\\n      </div>\\n    </ng-container>\\n\\n    <div class=\\\"mat-form-field-prefix\\\" *ngIf=\\\"_prefixChildren.length\\\">\\n      <ng-content select=\\\"[matPrefix]\\\"></ng-content>\\n    </div>\\n\\n    <div class=\\\"mat-form-field-infix\\\" #inputContainer>\\n      <ng-content></ng-content>\\n\\n      <span class=\\\"mat-form-field-label-wrapper\\\">\\n        <!-- We add aria-owns as a workaround for an issue in JAWS & NVDA where the label isn't\\n             read if it comes before the control in the DOM. -->\\n        <label class=\\\"mat-form-field-label\\\"\\n               (cdkObserveContent)=\\\"updateOutlineGap()\\\"\\n               [cdkObserveContentDisabled]=\\\"appearance != 'outline'\\\"\\n               [id]=\\\"_labelId\\\"\\n               [attr.for]=\\\"_control.id\\\"\\n               [attr.aria-owns]=\\\"_control.id\\\"\\n               [class.mat-empty]=\\\"_control.empty && !_shouldAlwaysFloat()\\\"\\n               [class.mat-form-field-empty]=\\\"_control.empty && !_shouldAlwaysFloat()\\\"\\n               [class.mat-accent]=\\\"color == 'accent'\\\"\\n               [class.mat-warn]=\\\"color == 'warn'\\\"\\n               #label\\n               *ngIf=\\\"_hasFloatingLabel()\\\"\\n               [ngSwitch]=\\\"_hasLabel()\\\">\\n\\n          <!-- @breaking-change 8.0.0 remove in favor of mat-label element an placeholder attr. -->\\n          <ng-container *ngSwitchCase=\\\"false\\\">\\n            <ng-content select=\\\"mat-placeholder\\\"></ng-content>\\n            <span>{{_control.placeholder}}</span>\\n          </ng-container>\\n\\n          <ng-content select=\\\"mat-label\\\" *ngSwitchCase=\\\"true\\\"></ng-content>\\n\\n          <!-- @breaking-change 8.0.0 remove `mat-placeholder-required` class -->\\n          <span\\n            class=\\\"mat-placeholder-required mat-form-field-required-marker\\\"\\n            aria-hidden=\\\"true\\\"\\n            *ngIf=\\\"!hideRequiredMarker && _control.required && !_control.disabled\\\">&#32;*</span>\\n        </label>\\n      </span>\\n    </div>\\n\\n    <div class=\\\"mat-form-field-suffix\\\" *ngIf=\\\"_suffixChildren.length\\\">\\n      <ng-content select=\\\"[matSuffix]\\\"></ng-content>\\n    </div>\\n  </div>\\n\\n  <!-- Underline used for legacy, standard, and box appearances. -->\\n  <div class=\\\"mat-form-field-underline\\\" #underline\\n       *ngIf=\\\"appearance != 'outline'\\\">\\n    <span class=\\\"mat-form-field-ripple\\\"\\n          [class.mat-accent]=\\\"color == 'accent'\\\"\\n          [class.mat-warn]=\\\"color == 'warn'\\\"></span>\\n  </div>\\n\\n  <div class=\\\"mat-form-field-subscript-wrapper\\\"\\n       [ngSwitch]=\\\"_getDisplayedMessages()\\\">\\n    <div *ngSwitchCase=\\\"'error'\\\" [@transitionMessages]=\\\"_subscriptAnimationState\\\">\\n      <ng-content select=\\\"mat-error\\\"></ng-content>\\n    </div>\\n\\n    <div class=\\\"mat-form-field-hint-wrapper\\\" *ngSwitchCase=\\\"'hint'\\\"\\n      [@transitionMessages]=\\\"_subscriptAnimationState\\\">\\n      <!-- TODO(mmalerba): use an actual <mat-hint> once all selectors are switched to mat-* -->\\n      <div *ngIf=\\\"hintLabel\\\" [id]=\\\"_hintLabelId\\\" class=\\\"mat-hint\\\">{{hintLabel}}</div>\\n      <ng-content select=\\\"mat-hint:not([align='end'])\\\"></ng-content>\\n      <div class=\\\"mat-form-field-hint-spacer\\\"></div>\\n      <ng-content select=\\\"mat-hint[align='end']\\\"></ng-content>\\n    </div>\\n  </div>\\n</div>\\n\",\n                animations: [matFormFieldAnimations.transitionMessages],\n                host: {\n                    'class': 'mat-form-field',\n                    '[class.mat-form-field-appearance-standard]': 'appearance == \"standard\"',\n                    '[class.mat-form-field-appearance-fill]': 'appearance == \"fill\"',\n                    '[class.mat-form-field-appearance-outline]': 'appearance == \"outline\"',\n                    '[class.mat-form-field-appearance-legacy]': 'appearance == \"legacy\"',\n                    '[class.mat-form-field-invalid]': '_control.errorState',\n                    '[class.mat-form-field-can-float]': '_canLabelFloat()',\n                    '[class.mat-form-field-should-float]': '_shouldLabelFloat()',\n                    '[class.mat-form-field-has-label]': '_hasFloatingLabel()',\n                    '[class.mat-form-field-hide-placeholder]': '_hideControlPlaceholder()',\n                    '[class.mat-form-field-disabled]': '_control.disabled',\n                    '[class.mat-form-field-autofilled]': '_control.autofilled',\n                    '[class.mat-focused]': '_control.focused',\n                    '[class.ng-untouched]': '_shouldForward(\"untouched\")',\n                    '[class.ng-touched]': '_shouldForward(\"touched\")',\n                    '[class.ng-pristine]': '_shouldForward(\"pristine\")',\n                    '[class.ng-dirty]': '_shouldForward(\"dirty\")',\n                    '[class.ng-valid]': '_shouldForward(\"valid\")',\n                    '[class.ng-invalid]': '_shouldForward(\"invalid\")',\n                    '[class.ng-pending]': '_shouldForward(\"pending\")',\n                    '[class._mat-animation-noopable]': '!_animationsEnabled'\n                },\n                inputs: ['color'],\n                encapsulation: ViewEncapsulation.None,\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                providers: [\n                    { provide: MAT_FORM_FIELD, useExisting: MatFormField },\n                ],\n                styles: [\".mat-form-field{display:inline-block;position:relative;text-align:left}[dir=rtl] .mat-form-field{text-align:right}.mat-form-field-wrapper{position:relative}.mat-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-form-field-prefix,.mat-form-field-suffix{white-space:nowrap;flex:none;position:relative}.mat-form-field-infix{display:block;position:relative;flex:auto;min-width:0;width:180px}.cdk-high-contrast-active .mat-form-field-infix{border-image:linear-gradient(transparent, transparent)}.mat-form-field-label-wrapper{position:absolute;left:0;box-sizing:content-box;width:100%;height:100%;overflow:hidden;pointer-events:none}[dir=rtl] .mat-form-field-label-wrapper{left:auto;right:0}.mat-form-field-label{position:absolute;left:0;font:inherit;pointer-events:none;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;transform-origin:0 0;transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1),color 400ms cubic-bezier(0.25, 0.8, 0.25, 1),width 400ms cubic-bezier(0.25, 0.8, 0.25, 1);display:none}[dir=rtl] .mat-form-field-label{transform-origin:100% 0;left:auto;right:0}.mat-form-field-empty.mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{display:block}.mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:block;transition:none}.mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float .mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-label-wrapper .mat-form-field-label{display:block}.mat-form-field-label:not(.mat-form-field-empty){transition:none}.mat-form-field-underline{position:absolute;width:100%;pointer-events:none;transform:scale3d(1, 1.0001, 1)}.mat-form-field-ripple{position:absolute;left:0;width:100%;transform-origin:50%;transform:scaleX(0.5);opacity:0;transition:background-color 300ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-form-field.mat-focused .mat-form-field-ripple,.mat-form-field.mat-form-field-invalid .mat-form-field-ripple{opacity:1;transform:none;transition:transform 300ms cubic-bezier(0.25, 0.8, 0.25, 1),opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1),background-color 300ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-subscript-wrapper{position:absolute;box-sizing:border-box;width:100%;overflow:hidden}.mat-form-field-subscript-wrapper .mat-icon,.mat-form-field-label-wrapper .mat-icon{width:1em;height:1em;font-size:inherit;vertical-align:baseline}.mat-form-field-hint-wrapper{display:flex}.mat-form-field-hint-spacer{flex:1 0 1em}.mat-error{display:block}.mat-form-field-control-wrapper{position:relative}.mat-form-field-hint-end{order:1}.mat-form-field._mat-animation-noopable .mat-form-field-label,.mat-form-field._mat-animation-noopable .mat-form-field-ripple{transition:none}\\n\", \".mat-form-field-appearance-fill .mat-form-field-flex{border-radius:4px 4px 0 0;padding:.75em .75em 0 .75em}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-flex{outline:solid 1px}.mat-form-field-appearance-fill .mat-form-field-underline::before{content:\\\"\\\";display:block;position:absolute;bottom:0;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-fill .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-fill:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-fill._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}.mat-form-field-appearance-fill .mat-form-field-subscript-wrapper{padding:0 1em}\\n\", \".mat-input-element{font:inherit;background:transparent;color:currentColor;border:none;outline:none;padding:0;margin:0;width:100%;max-width:100%;vertical-align:bottom;text-align:inherit;box-sizing:content-box}.mat-input-element:-moz-ui-invalid{box-shadow:none}.mat-input-element::-ms-clear,.mat-input-element::-ms-reveal{display:none}.mat-input-element,.mat-input-element::-webkit-search-cancel-button,.mat-input-element::-webkit-search-decoration,.mat-input-element::-webkit-search-results-button,.mat-input-element::-webkit-search-results-decoration{-webkit-appearance:none}.mat-input-element::-webkit-contacts-auto-fill-button,.mat-input-element::-webkit-caps-lock-indicator,.mat-input-element::-webkit-credentials-auto-fill-button{visibility:hidden}.mat-input-element[type=date],.mat-input-element[type=datetime],.mat-input-element[type=datetime-local],.mat-input-element[type=month],.mat-input-element[type=week],.mat-input-element[type=time]{line-height:1}.mat-input-element[type=date]::after,.mat-input-element[type=datetime]::after,.mat-input-element[type=datetime-local]::after,.mat-input-element[type=month]::after,.mat-input-element[type=week]::after,.mat-input-element[type=time]::after{content:\\\" \\\";white-space:pre;width:1px}.mat-input-element::-webkit-inner-spin-button,.mat-input-element::-webkit-calendar-picker-indicator,.mat-input-element::-webkit-clear-button{font-size:.75em}.mat-input-element::placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-moz-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-moz-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element::-webkit-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element::-webkit-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-input-element:-ms-input-placeholder{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-input-element:-ms-input-placeholder:-ms-input-placeholder{-ms-user-select:text}.mat-form-field-hide-placeholder .mat-input-element::placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-moz-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-webkit-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}.mat-form-field-hide-placeholder .mat-input-element:-ms-input-placeholder{color:transparent !important;-webkit-text-fill-color:transparent;transition:none}textarea.mat-input-element{resize:vertical;overflow:auto}textarea.mat-input-element.cdk-textarea-autosize{resize:none}textarea.mat-input-element{padding:2px 0;margin:-2px 0}select.mat-input-element{-moz-appearance:none;-webkit-appearance:none;position:relative;background-color:transparent;display:inline-flex;box-sizing:border-box;padding-top:1em;top:-1em;margin-bottom:-1em}select.mat-input-element::-ms-expand{display:none}select.mat-input-element::-moz-focus-inner{border:0}select.mat-input-element:not(:disabled){cursor:pointer}select.mat-input-element::-ms-value{color:inherit;background:none}.mat-focused .cdk-high-contrast-active select.mat-input-element::-ms-value{color:inherit}.mat-form-field-type-mat-native-select .mat-form-field-infix::after{content:\\\"\\\";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;position:absolute;top:50%;right:0;margin-top:-2.5px;pointer-events:none}[dir=rtl] .mat-form-field-type-mat-native-select .mat-form-field-infix::after{right:auto;left:0}.mat-form-field-type-mat-native-select .mat-input-element{padding-right:15px}[dir=rtl] .mat-form-field-type-mat-native-select .mat-input-element{padding-right:0;padding-left:15px}.mat-form-field-type-mat-native-select .mat-form-field-label-wrapper{max-width:calc(100% - 10px)}.mat-form-field-type-mat-native-select.mat-form-field-appearance-outline .mat-form-field-infix::after{margin-top:-5px}.mat-form-field-type-mat-native-select.mat-form-field-appearance-fill .mat-form-field-infix::after{margin-top:-10px}\\n\", \".mat-form-field-appearance-legacy .mat-form-field-label{transform:perspective(100px);-ms-transform:none}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon{width:1em}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button{font:inherit;vertical-align:baseline}.mat-form-field-appearance-legacy .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .mat-icon-button .mat-icon{font-size:inherit}.mat-form-field-appearance-legacy .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-legacy .mat-form-field-ripple{top:0;height:2px;overflow:hidden}.cdk-high-contrast-active .mat-form-field-appearance-legacy .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-legacy.mat-form-field-invalid:not(.mat-focused) .mat-form-field-ripple{height:1px}\\n\", \".mat-form-field-appearance-outline .mat-form-field-wrapper{margin:.25em 0}.mat-form-field-appearance-outline .mat-form-field-flex{padding:0 .75em 0 .75em;margin-top:-0.25em;position:relative}.mat-form-field-appearance-outline .mat-form-field-prefix,.mat-form-field-appearance-outline .mat-form-field-suffix{top:.25em}.mat-form-field-appearance-outline .mat-form-field-outline{display:flex;position:absolute;top:.25em;left:0;right:0;bottom:0;pointer-events:none}.mat-form-field-appearance-outline .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-end{border:1px solid currentColor;min-width:5px}.mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:5px 0 0 5px;border-right-style:none}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-start{border-right-style:solid;border-left-style:none;border-radius:0 5px 5px 0}.mat-form-field-appearance-outline .mat-form-field-outline-end{border-radius:0 5px 5px 0;border-left-style:none;flex-grow:1}[dir=rtl] .mat-form-field-appearance-outline .mat-form-field-outline-end{border-left-style:solid;border-right-style:none;border-radius:5px 0 0 5px}.mat-form-field-appearance-outline .mat-form-field-outline-gap{border-radius:.000001px;border:1px solid currentColor;border-left-style:none;border-right-style:none}.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-outline-gap{border-top-color:transparent}.mat-form-field-appearance-outline .mat-form-field-outline-thick{opacity:0}.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-start,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-end,.mat-form-field-appearance-outline .mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:2px}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline{opacity:0;transition:opacity 100ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick,.mat-form-field-appearance-outline.mat-form-field-invalid .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline{opacity:0;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-outline:not(.mat-form-field-disabled) .mat-form-field-flex:hover .mat-form-field-outline-thick{opacity:1}.mat-form-field-appearance-outline .mat-form-field-subscript-wrapper{padding:0 1em}.mat-form-field-appearance-outline._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-start,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-end,.mat-form-field-appearance-outline._mat-animation-noopable .mat-form-field-outline-gap{transition:none}\\n\", \".mat-form-field-appearance-standard .mat-form-field-flex{padding-top:.75em}.mat-form-field-appearance-standard .mat-form-field-underline{height:1px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-underline{height:0;border-top:solid 1px}.mat-form-field-appearance-standard .mat-form-field-ripple{bottom:0;height:2px}.cdk-high-contrast-active .mat-form-field-appearance-standard .mat-form-field-ripple{height:0;border-top:solid 2px}.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.cdk-high-contrast-active .mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline{border-top-style:dotted;border-top-width:2px}.mat-form-field-appearance-standard:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{opacity:1;transform:none;transition:opacity 600ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-form-field-appearance-standard._mat-animation-noopable:not(.mat-form-field-disabled) .mat-form-field-flex:hover~.mat-form-field-underline .mat-form-field-ripple{transition:none}\\n\"]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [ElementRef]\n            }] }, { type: ɵngcc1.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]\n            }] }, { type: ɵngcc2.Platform }, { type: ɵngcc0.NgZone }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }]; }, { floatLabel: [{\n            type: Input\n        }], appearance: [{\n            type: Input\n        }], hideRequiredMarker: [{\n            type: Input\n        }], hintLabel: [{\n            type: Input\n        }], underlineRef: [{\n            type: ViewChild,\n            args: ['underline']\n        }], _connectionContainerRef: [{\n            type: ViewChild,\n            args: ['connectionContainer', { static: true }]\n        }], _inputContainerRef: [{\n            type: ViewChild,\n            args: ['inputContainer']\n        }], _label: [{\n            type: ViewChild,\n            args: ['label']\n        }], _controlNonStatic: [{\n            type: ContentChild,\n            args: [MatFormFieldControl]\n        }], _controlStatic: [{\n            type: ContentChild,\n            args: [MatFormFieldControl, { static: true }]\n        }], _labelChildNonStatic: [{\n            type: ContentChild,\n            args: [MatLabel]\n        }], _labelChildStatic: [{\n            type: ContentChild,\n            args: [MatLabel, { static: true }]\n        }], _placeholderChild: [{\n            type: ContentChild,\n            args: [MatPlaceholder]\n        }], _errorChildren: [{\n            type: ContentChildren,\n            args: [MAT_ERROR, { descendants: true }]\n        }], _hintChildren: [{\n            type: ContentChildren,\n            args: [_MAT_HINT, { descendants: true }]\n        }], _prefixChildren: [{\n            type: ContentChildren,\n            args: [MAT_PREFIX, { descendants: true }]\n        }], _suffixChildren: [{\n            type: ContentChildren,\n            args: [MAT_SUFFIX, { 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 */\nclass MatFormFieldModule {\n}\nMatFormFieldModule.ɵfac = function MatFormFieldModule_Factory(t) { return new (t || MatFormFieldModule)(); };\nMatFormFieldModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatFormFieldModule });\nMatFormFieldModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[\n            CommonModule,\n            MatCommonModule,\n            ObserversModule,\n        ], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatFormFieldModule, [{\n        type: NgModule,\n        args: [{\n                declarations: [\n                    MatError,\n                    MatFormField,\n                    MatHint,\n                    MatLabel,\n                    MatPlaceholder,\n                    MatPrefix,\n                    MatSuffix,\n                ],\n                imports: [\n                    CommonModule,\n                    MatCommonModule,\n                    ObserversModule,\n                ],\n                exports: [\n                    MatCommonModule,\n                    MatError,\n                    MatFormField,\n                    MatHint,\n                    MatLabel,\n                    MatPlaceholder,\n                    MatPrefix,\n                    MatSuffix,\n                ]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatFormFieldModule, { declarations: function () { return [MatError, MatFormField, MatHint, MatLabel, MatPlaceholder, MatPrefix, MatSuffix]; }, imports: function () { return [CommonModule,\n        MatCommonModule,\n        ObserversModule]; }, exports: function () { return [MatCommonModule, MatError, MatFormField, MatHint, MatLabel, MatPlaceholder, MatPrefix, MatSuffix]; } }); })();\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_ERROR, MAT_FORM_FIELD, MAT_FORM_FIELD_DEFAULT_OPTIONS, MAT_PREFIX, MAT_SUFFIX, MatError, MatFormField, MatFormFieldControl, MatFormFieldModule, MatHint, MatLabel, MatPlaceholder, MatPrefix, MatSuffix, _MAT_HINT, getMatFormFieldDuplicatedHintError, getMatFormFieldMissingControlError, getMatFormFieldPlaceholderConflictError, matFormFieldAnimations };\n\n//# sourceMappingURL=form-field.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","'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","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n","var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var copyObject = require('./_copyObject'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n","var Stack = require('./_Stack'),\n    arrayEach = require('./_arrayEach'),\n    assignValue = require('./_assignValue'),\n    baseAssign = require('./_baseAssign'),\n    baseAssignIn = require('./_baseAssignIn'),\n    cloneBuffer = require('./_cloneBuffer'),\n    copyArray = require('./_copyArray'),\n    copySymbols = require('./_copySymbols'),\n    copySymbolsIn = require('./_copySymbolsIn'),\n    getAllKeys = require('./_getAllKeys'),\n    getAllKeysIn = require('./_getAllKeysIn'),\n    getTag = require('./_getTag'),\n    initCloneArray = require('./_initCloneArray'),\n    initCloneByTag = require('./_initCloneByTag'),\n    initCloneObject = require('./_initCloneObject'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isMap = require('./isMap'),\n    isObject = require('./isObject'),\n    isSet = require('./isSet'),\n    keys = require('./keys'),\n    keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n","var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n    isPrototype = require('./_isPrototype'),\n    nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n","var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n    baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nmodule.exports = copyObject;\n","var copyObject = require('./_copyObject'),\n    getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n    getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbolsIn = require('./_getSymbolsIn'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n","var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n","var arrayPush = require('./_arrayPush'),\n    getPrototype = require('./_getPrototype'),\n    getSymbols = require('./_getSymbols'),\n    stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n    cloneDataView = require('./_cloneDataView'),\n    cloneRegExp = require('./_cloneRegExp'),\n    cloneSymbol = require('./_cloneSymbol'),\n    cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n","var baseCreate = require('./_baseCreate'),\n    getPrototype = require('./_getPrototype'),\n    isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nmodule.exports = initCloneObject;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseIsMap = require('./_baseIsMap'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseIsSet = require('./_baseIsSet'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeysIn = require('./_baseKeysIn'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n","var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var baseIteratee = require('./_baseIteratee'),\n    baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\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 { DriveFolder } from '../../folders/models/driveFolder';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { ConfirmModalData } from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { UploadedFile } from '@common/uploads/uploaded-file';\nimport { SortColumn, SortDirection } from '../../entries/available-sorts';\nimport { LoadEntriesAction } from './events';\nimport { DriveApiIndexParams } from '../../drive-entry-api.service';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { ShareableLink } from '../../sharing/links/models/shareable-link';\nimport { MatDialogConfig } from '@angular/material/dialog';\nimport { User } from '../../../../common/core/types/models/User';\nimport { Workspace } from '../../../../common/workspaces/types/workspace';\nimport { DrivePage } from '../models/drive-page';\n\nexport class LoadUserFolders {\n    static readonly type = '[Drive] Load User Folders';\n}\n\nexport class LoadUserSpaceUsage {\n    static readonly type = '[Drive] Load User Space Usage';\n}\n\nexport class BuildFolderTree {\n    static readonly type = '[Drive] Build Folder Tree';\n    constructor(public folders?: DriveFolder[]) {}\n}\n\nexport class OpenFolder {\n    static readonly type = '[Drive] Open Folder';\n    constructor(public folder?: DriveFolder) {}\n}\n\nexport class OpenSearchPage {\n    static readonly type = '[Drive] Open Search Page';\n    constructor(public queryParams?: {\n        filters?: string,\n        query?: string,\n    }) {}\n}\n\nexport class SelectEntries {\n    static readonly type = '[Drive] Select Entries';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class SelectAllEntries {\n    static readonly type = '[Drive] Select All Entries';\n}\n\nexport class DeselectAllEntries {\n    static readonly type = '[Drive] Deselect All Entries';\n}\n\nexport class DeleteSelectedEntries {\n    static readonly type = '[Drive] Delete Selected Entries';\n}\n\nexport class OpenUploadsPanel {\n    static readonly type = '[Drive] Open UploadsApiService Panel';\n}\n\nexport class CloseUploadsPanel {\n    static readonly type = '[Drive] Close UploadsApiService Panel';\n}\n\nexport class AddEntries {\n    static readonly type = '[Drive] Add Entries';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class MoveEntries {\n    static readonly type = '[Drive API] Move Entries';\n    constructor(public destination: DriveFolder, public entries?: DriveEntry[]) {}\n}\n\nexport class OpenDialog {\n    static readonly type = '[Drive] Open Dialog';\n    constructor(public dialog: ComponentType<any>, public data?: object, public config?: MatDialogConfig) {}\n}\n\nexport class OpenConfirmDialog {\n    static readonly type = '[Drive] Open Confirm Dialog';\n    constructor(public data: ConfirmModalData, public confirmAction: any) {}\n}\n\nexport class SetViewMode {\n    static readonly type = '[Drive] Set View Mode';\n    constructor(public mode: 'list'|'grid') {}\n}\n\nexport class ToggleDetailsSidebar {\n    static readonly type = '[Drive] Toggle Details';\n}\n\nexport class ToggleSidebar {\n    static readonly type = '[Drive] Toggle Sidebar';\n}\n\nexport class UploadFiles {\n    static readonly type = '[Drive] Upload Files';\n    constructor(public files: UploadedFile[]) {}\n}\n\nexport class RestoreTrashedEntries {\n    static readonly type = '[Drive] Restore Trashed Entries';\n    constructor(public entries?: DriveEntry[]) {}\n}\n\nexport class DeleteTrashedEntriesForever {\n    static readonly type = '[Drive] Delete Trashed Entries Forever';\n}\n\nexport class EmptyTrash {\n    static readonly type = '[Drive] Empty Trash';\n}\n\nexport class OpenFilePreview {\n    static readonly type = '[Drive] Open File Preview Overlay';\n    constructor(public entries?: DriveEntry[]) {}\n}\n\nexport class DownloadEntries {\n    static readonly type = '[Drive] Download Files';\n    constructor(public entries?: FileEntry[], public link?: ShareableLink, public password?: string) {}\n}\n\nexport class AddStar {\n    static readonly type = '[Drive] Add a Star';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class RemoveStar {\n    static readonly type = '[Drive] Remove Star';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class RemoveEntries {\n    static readonly type = '[Drive] Remove Entries';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class ChangeSort {\n    static readonly type = '[Drive] Change Sort';\n    constructor(public sort: SortColumn, public direction: SortDirection = 'desc') {}\n}\n\nexport class LoadMoreEntries implements LoadEntriesAction {\n    static readonly type = '[Drive Infinite Scroll] Load More Entries';\n    public loadMore = true;\n    constructor(public queryParams: DriveApiIndexParams = {}) {}\n}\n\nexport class ReloadPageEntries implements LoadEntriesAction {\n    static readonly type = '[Drive] Reload Page Entries';\n    constructor(public queryParams: DriveApiIndexParams = {}, public page?: DrivePage) {}\n}\n\nexport class CopySelectedEntries {\n    static readonly type = '[Drive] Copy Selected Entries';\n}\n\nexport class OpenUploadWindow {\n    static readonly type = '[Drive] Open Upload Window';\n    constructor(public type: 'file'|'directory') {}\n}\n\nexport class ShowLoadingToast {\n    static readonly type = '[Drive] Show Loading Toast';\n    constructor(public message: string) {}\n}\n\nexport class HideLoadingToast {\n    static readonly type = '[Drive] Hide Loading Toast';\n}\n\nexport class ResetState {\n    static readonly type = '[Drive] Reset State';\n}\n\nexport class UpdateEntries {\n    static readonly type = '[Drive] Update Entries';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class SetCurrentUser {\n    static readonly type = '[Drive] Set Current User';\n    constructor(public user: User) {}\n}\n\nexport class SetWorkspace {\n    static readonly type = '[Drive] Set Workspace';\n    constructor(public workspace: Workspace) {}\n}\n\nexport class UpdateEntryDescription {\n    static readonly type = '[Drive] Update Entry Description';\n    constructor(public entry: FileEntry, public description: string) {}\n}\n\n\n\n\n\n","import { DrivePageType } from './available-pages';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { SortColumn, SortDirection } from '../../entries/available-sorts';\n\nexport const DRIVE_PAGE_NAMES: {[key: string]: DrivePageType} = {\n    FOLDER: 'folder',\n    RECENT: 'recent',\n    TRASH: 'trash',\n    SHARES: 'shares',\n    STARRED: 'starred',\n    SEARCH: 'search',\n    WORKSPACES: 'workspaces',\n};\n\nexport interface DrivePageParams {\n    name: DrivePageType;\n    viewName: string;\n    folder?: DriveFolder;\n    folderHash?: string;\n    hasActions?: boolean;\n    disableSort?: boolean;\n    sortColumn?: SortColumn;\n    queryParams?: object;\n    sortDirection?: SortDirection;\n}\n\nexport class DrivePage implements DrivePageParams {\n    name = null;\n    viewName = null;\n    folder = null;\n    folderHash = null;\n    hasActions = false;\n    sortColumn = 'updated_at' as SortColumn;\n    sortDirection = 'desc' as SortDirection;\n    queryParams = {};\n\n    constructor(params: DrivePageParams) {\n        Object.keys(params).forEach(key => {\n            this[key] = params[key];\n        });\n    }\n}\n\nexport const RECENT_PAGE = new DrivePage({\n    name: DRIVE_PAGE_NAMES.RECENT,\n    viewName: 'Recent',\n    disableSort: true,\n    sortColumn: 'created_at',\n    sortDirection: 'desc',\n    queryParams: {\n        recentOnly: true,\n    }\n});\n\nexport const SEARCH_PAGE = new DrivePage({\n    name: DRIVE_PAGE_NAMES.SEARCH,\n    viewName: 'Search results',\n});\n\nexport const SHARES_PAGE = new DrivePage({\n    name: DRIVE_PAGE_NAMES.SHARES,\n    viewName: 'Shared',\n    queryParams: {\n        sharedOnly: true,\n    }\n});\n\nexport const TRASH_PAGE = new DrivePage({\n    name: DRIVE_PAGE_NAMES.TRASH,\n    viewName: 'Trash',\n    hasActions: true,\n    queryParams: {\n        deletedOnly: true,\n    }\n});\n\nexport const WORKSPACE_INDEX_PAGE = new DrivePage({\n    name: DRIVE_PAGE_NAMES.WORKSPACES,\n    viewName: 'Workspaces',\n});\n\nexport const STARRED_PAGE = new DrivePage({\n    name: DRIVE_PAGE_NAMES.STARRED,\n    viewName: 'Starred',\n    queryParams: {\n        starredOnly: true,\n    }\n});\n\nexport class FolderPage extends DrivePage {\n    constructor(folder?: DriveFolder) {\n        super({\n            name: DRIVE_PAGE_NAMES.FOLDER,\n            viewName: folder?.name,\n            folder,\n            folderHash: folder?.hash,\n            hasActions: true\n        });\n    }\n}\n","import { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { DriveApiIndexParams } from '../../drive-entry-api.service';\nimport { SortColumn } from '../../entries/available-sorts';\nimport {\n    DrivePage,\n    FolderPage,\n    RECENT_PAGE,\n    SEARCH_PAGE,\n    SHARES_PAGE,\n    STARRED_PAGE,\n    TRASH_PAGE,\n    WORKSPACE_INDEX_PAGE,\n} from '../models/drive-page';\n\nexport interface LoadEntriesAction {\n    queryParams: DriveApiIndexParams;\n    page?: DrivePage;\n    folder?: DriveFolder;\n    loadMore?: boolean;\n}\n\nexport class RecentEntriesPageOpened implements LoadEntriesAction {\n    static readonly type = '[Drive] Recent Entries Page Opened';\n    public page = RECENT_PAGE;\n    public queryParams = {orderBy: 'created_at' as SortColumn, recentOnly: true};\n}\n\nexport class FolderPageOpened implements LoadEntriesAction {\n    static readonly type = '[Drive] Folder Page Opened';\n    public page: DrivePage;\n    public queryParams = {};\n    constructor(folderHash: string|null) {\n        this.page = new FolderPage({hash: folderHash} as DriveFolder);\n    }\n}\n\nexport class SharesFolderOpened implements LoadEntriesAction {\n    static readonly type = '[Drive] Shared folder opened';\n    public page = SHARES_PAGE;\n    public queryParams = {sharedOnly: true};\n}\n\nexport class TrashPageOpened implements LoadEntriesAction {\n    static readonly type = '[Drive] Trash Page Opened';\n    public page = TRASH_PAGE;\n    public queryParams = {deletedOnly: true};\n}\n\nexport class WorkspacesIndexPageOpened {\n    static readonly type = '[Drive] Workspaces Index Page Opened';\n    public page = WORKSPACE_INDEX_PAGE;\n}\n\nexport class SearchPageOpened implements LoadEntriesAction {\n    static readonly type = '[Drive] Search Page Opened';\n    public page = SEARCH_PAGE;\n    constructor(public queryParams: {\n        filters?: string;\n        query?: string;\n    } = {}) {}\n}\n\nexport class StarredPageOpened implements LoadEntriesAction {\n    static readonly type = '[Drive] Starred Entries Page Opened';\n    public page = STARRED_PAGE;\n    public queryParams = {starredOnly: true};\n}\n\nexport class EntriesSelectedViaDrag {\n    static readonly type = '[Drive] Entries Selected Via Drag';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class EntrySelectedViaContextMenu {\n    static readonly type = '[Drive] File Selected Via ContextMenu';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class EntryTapped {\n    static readonly type = '[Drive] User Tapped File';\n    constructor(public entry: DriveEntry, public ctrlKey = false) {}\n}\n\nexport class EntryDoubleTapped {\n    static readonly type = '[Drive] User Double Tapped Entry';\n    constructor(public entry: DriveEntry) {}\n}\n\nexport class FileDeleteSuccess {\n    static readonly type = '[Drive] Successfully Deleted Files';\n    constructor(public deletedFiles: DriveEntry[]) {}\n}\n\nexport class EntryContextMenuOpened {\n    static readonly type = '[Drive] Entry Context Menu Opened';\n    constructor(public entry: DriveEntry) {}\n}\n\nexport class NewFolderCreated {\n    static readonly type = '[Drive] New Folder Created';\n    constructor(public folder: DriveFolder) {}\n}\n\nexport class EntryRenamed {\n    static readonly type = '[Drive] Entry Renamed';\n    constructor(public entry: DriveEntry, public newName: string) {}\n}\n\nexport class StartedDragging {\n    static readonly type = '[Drive] Started Dragging';\n}\n\nexport class StoppedDragging {\n    static readonly type = '[Drive] Stopped Dragging';\n}\n\nexport class MoveEntriesSuccess {\n    static readonly type = '[Drive API] Move Entries Success';\n    constructor(\n        public destination: number,\n        public oldLocation: number,\n        public entries: DriveEntry[]\n    ) {}\n}\n\nexport class MoveEntriesFailed {\n    static readonly type = '[Drive API] Move Entries Failed';\n    constructor(public messages: object) {}\n}\n\nexport class TrashedEntriesDeleteSuccess {\n    static readonly type = '[Drive API] Trashed Entries Delete Forever Success';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class TrashedEntriesRestoreSuccess {\n    static readonly type = '[Drive API] Trashed Entries Restore Success';\n    constructor(public entries: DriveEntry[]) {}\n}\n\nexport class NotEnoughSpaceError {\n    static readonly type = '[Drive] Not Enough Space Error';\n}\n\nexport class UserSpaceUsageChanged {\n    static readonly type = '[Drive] User Space Usage Changed';\n}\n\nexport class BreakpointChanged {\n    static readonly type = '[Drive] BreakpointChanged';\n    constructor(public status: {isMobile: boolean}) {}\n}\n\n\n","import { SortColumn, SortDirection } from '../../entries/available-sorts';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { DrivePage } from './drive-page';\nimport { UserSpaceUsage } from './user-space-usage';\nimport { User } from '@common/core/types/models/User';\nimport { Workspace } from '../../../../common/workspaces/types/workspace';\n\nexport interface DriveStateModel {\n    isMobile: boolean;\n    activePage: DrivePage;\n    folderTree: DriveFolder[];\n    flatFolders: DriveFolder[];\n    userFoldersLoaded: boolean;\n    entries: DriveEntry[];\n    selectedEntries: DriveEntry[];\n    spaceUsage: UserSpaceUsage;\n    rootFolder?: DriveFolder;\n    meta: {\n        currentPage: number;\n        lastPage: number;\n        sortColumn: SortColumn;\n        sortDirection: SortDirection;\n        filters?: string|null,\n        query?: string|null\n    };\n    dragging: boolean;\n    loading: boolean;\n    uploadsPanelOpen: boolean;\n    viewMode: 'list'|'grid';\n    detailsVisible: boolean;\n    sidebarOpen: boolean;\n    currentUser: User|null;\n    activeWorkspace: Workspace|null;\n}\n\nexport const VIEW_MODE_KEY = 'bedrive.viewMode';\n","import { DriveStateModel } from './drive-state-model';\n\nexport const DRIVE_STATE_MODEL_DEFAULTS: DriveStateModel = {\n    isMobile: false,\n    activePage: null,\n    folderTree: [],\n    flatFolders: [],\n    userFoldersLoaded: false,\n    entries: [],\n    selectedEntries: [],\n    dragging: false,\n    loading: false,\n    uploadsPanelOpen: false,\n    viewMode: 'grid' as 'grid'|'list',\n    detailsVisible: true,\n    sidebarOpen: true,\n    currentUser: null,\n    activeWorkspace: null,\n    spaceUsage: {\n        available: null,\n        used: null,\n    },\n    meta: {\n        sortColumn: 'updated_at',\n        sortDirection: 'desc',\n        currentPage: 0,\n        lastPage: 0,\n    },\n};\n","export enum LoadingToastMessages {\n    copyEntries =  'Copying items...',\n    emptyTrash = 'Emptying trash...',\n    moveEntries = 'Moving items...',\n}\n","import { InjectionToken } from '@angular/core';\nimport { UploadInputConfig } from '../../common/uploads/upload-input-config';\n\nexport const DRIVE_UPLOAD_INPUT_CONFIG = new InjectionToken<UploadInputConfig>('DRIVE_UPLOAD_INPUT_CONFIG');","export enum FOLDERS_API_ROUTES {\n    GET_ALL = 'drive/folders',\n    CREATE = 'drive/folders',\n}\n","import {Injectable} from '@angular/core';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {FOLDERS_API_ROUTES} from './folders-api-routes.enum';\nimport {DriveFolder} from '../models/driveFolder';\nimport {CurrentUser} from '@common/auth/current-user';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { PaginatedBackendResponse } from '@common/core/types/pagination/paginated-backend-response';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class FoldersApiService {\n\n    constructor(\n        private http: AppHttpClient,\n        private currentUser: CurrentUser\n    ) {}\n\n    public getAll(params?: {userId?: number}): PaginatedBackendResponse<DriveFolder> {\n        return this.http.get(FOLDERS_API_ROUTES.GET_ALL, params);\n    }\n\n    public getAllForCurrentUser(): BackendResponse<{folders: DriveFolder[], rootFolder: DriveFolder}> {\n        return this.http.get('drive/users/' + this.currentUser.get('id') + '/folders');\n    }\n\n    public create(params: {name: string, parentId: number|null}): BackendResponse<{folder: DriveFolder}> {\n        return this.http.post(FOLDERS_API_ROUTES.CREATE, params);\n    }\n\n    public getByHash(hash: string): BackendResponse<{folder: DriveFolder}> {\n        return this.http.get('drive/folders/find', {hash});\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { AppHttpClient } from '@common/core/http/app-http-client.service';\nimport { DriveEntry } from './files/models/drive-entry';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { DriveFolder } from './folders/models/driveFolder';\nimport { Observable } from 'rxjs';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { Tag } from '@common/core/types/models/Tag';\nimport { SortColumn, SortDirection } from './entries/available-sorts';\nimport { UserSpaceUsage } from './state/models/user-space-usage';\nimport { PaginationResponse } from '@common/core/types/pagination/pagination-response';\n\nexport interface DriveApiIndexParams {\n    orderBy?: SortColumn;\n    orderDir?: SortDirection;\n    folderId?: number;\n    userId?: number;\n    query?: string;\n    filters?: string;\n    deletedOnly?: boolean;\n    starredOnly?: boolean;\n    sharedOnly?: boolean;\n    per_page?: number;\n    page?: number;\n    recentOnly?: boolean;\n}\n\nexport interface DriveEntriesPaginationResponse extends PaginationResponse<DriveFolder> {\n    folder: DriveFolder;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DriveEntryApiService {\n    constructor(private http: AppHttpClient, private currentUser: CurrentUser) {}\n\n    public getEntriesForFolder(params: DriveApiIndexParams = {}): Observable<DriveEntriesPaginationResponse> {\n        return this.http.get('drive/entries', params);\n    }\n\n    public getCurrentUserEntries(params: DriveApiIndexParams): Observable<DriveEntriesPaginationResponse> {\n        params.userId = this.currentUser.get('id');\n        return this.http.get('drive/entries', params);\n    }\n\n    public update(entryId: number, params: {name?: string, description?: string}): BackendResponse<{fileEntry: DriveEntry}> {\n        return this.http.put('uploads/' + entryId, params);\n    }\n\n    public delete(params: {entryIds?: number[], deleteForever?: boolean, emptyTrash?: boolean}): BackendResponse<void> {\n        return this.http.delete('drive/entries', params);\n    }\n\n    public copy(params: {entryIds: number[]}): BackendResponse<{entries: DriveEntry[]}> {\n        return this.http.post('drive/entries/copy', params);\n    }\n\n    public restore(params: {entryIds: number[]}): BackendResponse<void> {\n        return this.http.post('drive/entries/restore', params);\n    }\n\n    public emptyTrash(): BackendResponse<void> {\n        return this.delete({emptyTrash: true});\n    }\n\n    public moveEntries(params: {entryIds: number[], destination: number}): BackendResponse<{entries: DriveEntry[]}> {\n        return this.http.post('drive/entries/move', params);\n    }\n\n    public addStar(entryIds: number[]): BackendResponse<{tag: Tag}> {\n        return this.http.post('drive/entries/star', {entryIds});\n    }\n\n    public removeStar(entryIds: number[]): BackendResponse<{tag: Tag}> {\n        return this.http.post('drive/entries/unstar', {entryIds});\n    }\n\n    public getSpaceUsage(): BackendResponse<UserSpaceUsage> {\n        return this.http.get('drive/user/space-usage');\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { DriveFolder } from './folders/models/driveFolder';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DriveUrlsService {\n    public driveRoot() {\n        return '/drive';\n    }\n\n    public folder(folder: DriveFolder) {\n        if ( ! folder?.id) {\n            return this.driveRoot();\n        } else {\n            return `/drive/folders/${(folder as DriveFolder).hash}`;\n        }\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 { AllowedExtensionsValidation } from '@common/uploads/validation/validations/allowed-extensions-validation';\nimport { BlockedExtensionsValidation } from '@common/uploads/validation/validations/blocked-extensions-validation';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DriveUploadValidator extends UploadValidator {\n    protected readonly DEFAULT_MAX_FILE_SIZE_MB = 8;\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 {DriveFolder} from '../folders/models/driveFolder';\nimport {DriveEntry} from '../files/models/drive-entry';\nimport {Action, Selector, State, StateContext, Store} from '@ngxs/store';\nimport {FoldersApiService} from '../folders/api/folders-api.service';\nimport {finalize, tap} from 'rxjs/operators';\nimport {DriveApiIndexParams, DriveEntryApiService} from '../drive-entry-api.service';\nimport {Router} from '@angular/router';\nimport {DriveUrlsService} from '../drive-urls.service';\nimport {\n    AddEntries,\n    AddStar,\n    BuildFolderTree,\n    CopySelectedEntries,\n    DeleteSelectedEntries,\n    DeleteTrashedEntriesForever,\n    DeselectAllEntries,\n    EmptyTrash,\n    HideLoadingToast,\n    LoadMoreEntries,\n    LoadUserFolders,\n    LoadUserSpaceUsage,\n    MoveEntries,\n    OpenConfirmDialog,\n    OpenFilePreview,\n    OpenFolder,\n    OpenSearchPage,\n    OpenUploadsPanel,\n    OpenUploadWindow,\n    ReloadPageEntries,\n    RemoveEntries,\n    RemoveStar,\n    ResetState,\n    RestoreTrashedEntries,\n    SelectAllEntries,\n    SelectEntries,\n    SetCurrentUser,\n    SetViewMode,\n    SetWorkspace,\n    ShowLoadingToast,\n    ToggleDetailsSidebar,\n    ToggleSidebar,\n    UpdateEntries,\n    UpdateEntryDescription,\n    UploadFiles,\n} from './actions/commands';\nimport {\n    BreakpointChanged,\n    EntriesSelectedViaDrag,\n    EntryContextMenuOpened,\n    EntryDoubleTapped,\n    EntryRenamed,\n    EntrySelectedViaContextMenu,\n    EntryTapped,\n    FileDeleteSuccess,\n    FolderPageOpened,\n    LoadEntriesAction,\n    MoveEntriesFailed,\n    MoveEntriesSuccess,\n    NewFolderCreated,\n    NotEnoughSpaceError,\n    RecentEntriesPageOpened,\n    SearchPageOpened,\n    SharesFolderOpened,\n    StarredPageOpened,\n    StartedDragging,\n    StoppedDragging,\n    TrashedEntriesDeleteSuccess,\n    TrashedEntriesRestoreSuccess,\n    TrashPageOpened,\n    UserSpaceUsageChanged,\n    WorkspacesIndexPageOpened,\n} from './actions/events';\nimport {DriveStateModel, VIEW_MODE_KEY} from './models/drive-state-model';\nimport {DRIVE_STATE_MODEL_DEFAULTS} from './models/drive-state-model-defaults';\nimport {LocalStorage} from '@common/core/services/local-storage.service';\nimport {UploadQueueService} from '@common/uploads/upload-queue/upload-queue.service';\nimport {DriveUploadValidator} from '../uploads/drive-upload-validator';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {Inject, Injectable} from '@angular/core';\nimport {UploadInputConfig} from '@common/uploads/upload-input-config';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {UserSpaceUsage} from './models/user-space-usage';\nimport {LoadingToastMessages} from '../messages/loading-toast/loading-toast-messages';\nimport {User} from '@common/core/types/models/User';\nimport {DRIVE_PAGE_NAMES, DrivePage, TRASH_PAGE} from './models/drive-page';\nimport {DRIVE_UPLOAD_INPUT_CONFIG} from '../upload-input-config';\nimport {Tag} from '@common/core/types/models/Tag';\nimport {FileEntry} from '@common/uploads/types/file-entry';\nimport {hasKey} from '@common/core/utils/has-key';\nimport {BackendErrorResponse} from '../../../common/core/types/backend-error-response';\nimport {buildFolderTree} from '../sidebar/folders-tree/build-folder-tree';\nimport {WorkspacesService} from '../../../common/workspaces/workspaces.service';\nimport {Workspace} from '../../../common/workspaces/types/workspace';\nimport {Toast} from '../../../common/core/ui/toast.service';\n\n@State<DriveStateModel>({\n    name: 'drive',\n    defaults: DRIVE_STATE_MODEL_DEFAULTS,\n})\n@Injectable()\nexport class DriveState {\n    constructor(\n        private foldersApi: FoldersApiService,\n        private entriesApi: DriveEntryApiService,\n        private router: Router,\n        private driveUrls: DriveUrlsService,\n        private uploads: UploadQueueService,\n        private store: Store,\n        private localStore: LocalStorage,\n        private validator: DriveUploadValidator,\n        private workspaces: WorkspacesService,\n        private toast: Toast,\n        @Inject(DRIVE_UPLOAD_INPUT_CONFIG) private uploadInputConfig: UploadInputConfig\n    ) {}\n\n    @Selector()\n    static flatFolders(state: DriveStateModel) {\n        return state.flatFolders;\n    }\n\n    @Selector()\n    static userFoldersLoaded(state: DriveStateModel) {\n        return state.userFoldersLoaded;\n    }\n\n    @Selector()\n    static activePage(state: DriveStateModel) {\n        return state.activePage;\n    }\n\n    @Selector()\n    static activePageName(state: DriveStateModel) {\n        return state.activePage.name;\n    }\n\n    @Selector()\n    static userFolders(state: DriveStateModel) {\n        return state.folderTree;\n    }\n\n    @Selector()\n    static selectedEntries(state: DriveStateModel) {\n        return state.selectedEntries;\n    }\n\n    @Selector([DriveState.selectedEntries])\n    static selectedEntryIds(state: DriveStateModel, selectedEntries: DriveEntry[]) {\n        return selectedEntries.map(entry => entry.id);\n    }\n\n    @Selector([DriveState.selectedEntries])\n    static selectedEntry(state: DriveStateModel, selected: DriveEntry[]) {\n        return selected ? selected[selected.length - 1] : null;\n    }\n\n    @Selector([DriveState.selectedEntry])\n    static selectedEntryOrActiveFolder(state: DriveStateModel, selected: DriveEntry[]) {\n        return selected || state.activePage.folder;\n    }\n\n    @Selector([DriveState.selectedEntryOrActiveFolder, DriveState.flatFolders])\n    static selectedEntryParent(\n        state: DriveStateModel,\n        selected: DriveFolder,\n        folders: DriveFolder[]\n    ) {\n        if (!selected || !folders || !selected.parent_id) {\n            return state.rootFolder;\n        }\n        return folders.find(f => f.id === selected.parent_id);\n    }\n\n    @Selector([DriveState.selectedEntries])\n    static anythingSelected(state: DriveStateModel, selectedEntries: DriveEntry[]) {\n        return selectedEntries.length > 0;\n    }\n\n    @Selector([DriveState.selectedEntries])\n    static allSelectedEntriesStarred(\n        state: DriveStateModel,\n        selectedEntries: DriveEntry[]\n    ) {\n        return selectedEntries.every(\n            entry => !!entry.tags.find(tag => tag.name === 'starred')\n        );\n    }\n\n    @Selector([DriveState.selectedEntries])\n    static onlyFoldersSelected(state: DriveStateModel, selectedEntries: DriveEntry[]) {\n        return selectedEntries.every(entry => entry.type === 'folder');\n    }\n\n    @Selector()\n    static entries(state: DriveStateModel) {\n        return state.entries;\n    }\n\n    @Selector()\n    static entriesEmpty(state: DriveStateModel) {\n        // only return true if entries have already loaded\n        return state.meta.currentPage && !state.loading && state.entries.length === 0;\n    }\n\n    @Selector([DriveState.selectedEntries])\n    static multipleEntriesSelected(\n        state: DriveStateModel,\n        selectedEntries: DriveEntry[]\n    ) {\n        return selectedEntries.length > 1;\n    }\n\n    @Selector()\n    static activeFolder(state: DriveStateModel) {\n        return state.activePage.folder;\n    }\n\n    @Selector()\n    static rootFolder(state: DriveStateModel) {\n        return state.rootFolder;\n    }\n\n    @Selector()\n    static meta(state: DriveStateModel) {\n        return state.meta;\n    }\n\n    @Selector()\n    static dragging(state: DriveStateModel) {\n        return state.dragging;\n    }\n\n    @Selector()\n    static loading(state: DriveStateModel) {\n        return state.loading;\n    }\n\n    @Selector()\n    static currentPage(state: DriveStateModel) {\n        return state.meta.currentPage;\n    }\n\n    @Selector()\n    static viewMode(state: DriveStateModel) {\n        return state.viewMode;\n    }\n\n    @Selector()\n    static detailsOpen(state: DriveStateModel) {\n        return state.detailsVisible;\n    }\n\n    @Selector()\n    static sidebarOpen(state: DriveStateModel) {\n        return state.sidebarOpen;\n    }\n\n    @Selector()\n    static sortColumn(state: DriveStateModel) {\n        return state.meta.sortColumn;\n    }\n\n    @Selector()\n    static sortDirection(state: DriveStateModel) {\n        return state.meta.sortDirection;\n    }\n\n    @Selector()\n    static canLoadMoreEntries(state: DriveStateModel) {\n        return state.meta.currentPage < state.meta.lastPage;\n    }\n\n    @Selector()\n    static userSpaceUsed(state: DriveStateModel) {\n        return state.spaceUsage.used;\n    }\n\n    @Selector()\n    static userSpaceAvailable(state: DriveStateModel) {\n        return state.spaceUsage.available;\n    }\n\n    @Selector([DriveState.userSpaceUsed, DriveState.userSpaceAvailable])\n    static spaceUsedPercent(\n        state: DriveStateModel,\n        spaceUsed: number,\n        spaceAvail: number\n    ) {\n        // null means that user has unlimited space available\n        return spaceAvail === null ? 0 : (spaceUsed * 100) / spaceAvail;\n    }\n\n    @Selector()\n    static isMobile(state: DriveStateModel) {\n        return state.isMobile;\n    }\n\n    static userHasPermission(\n        permission: 'edit' | 'owner',\n        folder: DriveEntry,\n        user: User\n    ) {\n        // we are not in a folder view, can bail\n        if (!folder || !user) return false;\n\n        // check if user is the owner of currently open folder\n        const folderUser = (folder as DriveEntry).users.find(u => u.id === user.id);\n        if (folderUser.owns_entry || folderUser.entry_permissions[permission]) {\n            return true;\n        }\n    }\n\n    @Selector()\n    static currentUser(state: DriveStateModel) {\n        return state.currentUser;\n    }\n\n    @Selector()\n    static activeWorkspace(state: DriveStateModel) {\n        return state.activeWorkspace;\n    }\n\n    @Selector([DriveState.activeFolder, DriveState.currentUser])\n    static userOwnsActiveFolder(\n        state: DriveStateModel,\n        activeFolder: DriveEntry,\n        currentUser: User\n    ) {\n        return DriveState.userHasPermission('owner', activeFolder, currentUser);\n    }\n\n    @Selector([DriveState.selectedEntries, DriveState.currentUser])\n    static userOwnsSelectedEntries(\n        state: DriveStateModel,\n        selectedEntries: DriveEntry[],\n        currentUser: User\n    ) {\n        return selectedEntries.every(entry => {\n            return DriveState.userHasPermission('owner', entry, currentUser);\n        });\n    }\n\n    @Selector([DriveState.selectedEntries, DriveState.currentUser])\n    static userCanEditSelectedEntries(\n        state: DriveStateModel,\n        entries: DriveEntry[],\n        currentUser: User\n    ) {\n        return entries.every(entry => {\n            const user = entry.users.find(u => u.id === currentUser.id);\n            return user && (user.owns_entry || user.entry_permissions.edit);\n        });\n    }\n\n    @Selector([DriveState.activePage, DriveState.currentUser, DriveState.activeWorkspace])\n    static canUpload(\n        state: DriveStateModel,\n        page: DrivePage,\n        currentUser: User,\n        workspace: Workspace\n    ) {\n        if (!page.folder || !currentUser || !workspace) {\n            return false;\n        }\n\n        // check if user can create files in this workspace\n        if (workspace?.id && page.folder.workspace_id === workspace.id) {\n            const member = workspace.currentUser;\n            return (\n                member &&\n                (member.is_owner ||\n                    member.permissions.findIndex(p => p.name === 'files.create') > -1)\n            );\n\n            // check if user has \"edit\" permission for folder if it's not part of workspace\n        } else {\n            return DriveState.userHasPermission('edit', page.folder, currentUser);\n        }\n    }\n\n    @Action(LoadUserFolders)\n    loadUserFolders(ctx: StateContext<DriveStateModel>) {\n        return this.foldersApi.getAllForCurrentUser().pipe(\n            tap(response => {\n                ctx.patchState({rootFolder: response.rootFolder});\n                return ctx.dispatch(new BuildFolderTree(response.folders));\n            })\n        );\n    }\n\n    @Action(BuildFolderTree)\n    buildFolderTree(ctx: StateContext<DriveStateModel>, action: BuildFolderTree) {\n        const flatFolders = action.folders || ctx.getState().flatFolders;\n        const tree = buildFolderTree(flatFolders);\n        ctx.patchState({\n            folderTree: tree,\n            flatFolders,\n            userFoldersLoaded: true,\n        });\n    }\n\n    @Action(WorkspacesIndexPageOpened)\n    workspacesIndexPageOpened(\n        ctx: StateContext<DriveStateModel>,\n        action: WorkspacesIndexPageOpened\n    ) {\n        ctx.patchState({activePage: action.page});\n    }\n\n    @Action(FolderPageOpened)\n    @Action(RecentEntriesPageOpened)\n    @Action(TrashPageOpened)\n    @Action(StarredPageOpened)\n    @Action(SearchPageOpened, {cancelUncompleted: true}) // cancel search when typing in search bar\n    @Action(SharesFolderOpened)\n    @Action(ReloadPageEntries)\n    @Action(LoadMoreEntries)\n    loadDriveEntries(ctx: StateContext<DriveStateModel>, action: LoadEntriesAction) {\n        const oldState = ctx.getState();\n        const newState = {\n            loading: true,\n            meta: {...oldState.meta},\n        } as Partial<DriveStateModel>;\n\n        // only replace active page if it's actually specified, this way\n        // \"Reload\" and \"LoadMore\" actions will not remove active page\n        newState.activePage = action.page ? action.page : oldState.activePage;\n\n        // set sorting from specified query params or specified page or currently active page\n        newState.meta.sortColumn =\n            action.queryParams.orderBy ||\n            oldState.meta.sortColumn ||\n            newState.activePage.sortColumn;\n        newState.meta.sortDirection =\n            action.queryParams.orderDir ||\n            oldState.meta.sortDirection ||\n            newState.activePage.sortDirection;\n\n        // if it's not search page, clear type and query\n        if (newState.activePage.name !== DRIVE_PAGE_NAMES.SEARCH) {\n            newState.meta.query = null;\n            newState.meta.filters = null;\n        }\n\n        newState.meta.query = action.queryParams.query || newState.meta.query;\n        newState.meta.filters = action.queryParams.filters || newState.meta.filters;\n\n        ctx.patchState(newState);\n        const params = this.transformQueryParams({\n            ...action.queryParams,\n            ...newState.activePage.queryParams,\n        });\n\n        if (\n            newState.activePage.name === DRIVE_PAGE_NAMES.SEARCH &&\n            !newState.meta.query &&\n            !newState.meta.filters\n        ) {\n            return ctx.patchState({\n                entries: [],\n                loading: false,\n                activePage: newState.activePage,\n                meta: {\n                    ...newState.meta,\n                    lastPage: 1,\n                    currentPage: 1,\n                },\n            });\n        }\n\n        return this.entriesApi.getEntriesForFolder(params).pipe(\n            tap(\n                response => {\n                    const entries = action.loadMore ? oldState.entries : [];\n\n                    const state = {\n                        entries: entries.concat(response.data),\n                        meta: {\n                            ...newState.meta,\n                            lastPage: response.last_page,\n                            currentPage: response.current_page,\n                        },\n                        loading: false,\n                    } as Partial<DriveStateModel>;\n\n                    state.activePage = {\n                        ...newState.activePage,\n                        folder: response.folder,\n                    };\n\n                    return ctx.patchState(state);\n                },\n                () => {\n                    return ctx.patchState({loading: false});\n                }\n            )\n        );\n    }\n\n    @Action(OpenFolder, {cancelUncompleted: true})\n    openFolder(ctx: StateContext<DriveStateModel>, action: OpenFolder) {\n        const currentFolder = ctx.getState().activePage.folder;\n        if (currentFolder && action.folder.id === currentFolder.id) return;\n\n        if (action.folder && action.folder.deleted_at) {\n            return ctx.dispatch(\n                new OpenConfirmDialog(\n                    {\n                        title: 'Folder is in trash',\n                        body: 'To view this folder, you need to restore it first.',\n                        ok: 'Restore',\n                    },\n                    new RestoreTrashedEntries([action.folder as DriveFolder])\n                )\n            );\n        } else {\n            ctx.patchState({loading: true});\n            return this.router.navigate([this.driveUrls.folder(action.folder)]);\n        }\n    }\n\n    @Action(OpenSearchPage, {cancelUncompleted: true})\n    openSearchPage(ctx: StateContext<DriveStateModel>, action: OpenSearchPage) {\n        ctx.patchState({loading: true});\n        return this.router.navigate(['/drive/search'], {queryParams: action.queryParams});\n    }\n\n    @Action(EntriesSelectedViaDrag)\n    @Action(EntrySelectedViaContextMenu)\n    @Action(SelectEntries)\n    selectEntries(\n        ctx: StateContext<DriveStateModel>,\n        action: EntriesSelectedViaDrag | EntrySelectedViaContextMenu | SelectEntries\n    ) {\n        ctx.patchState({selectedEntries: action.entries});\n    }\n\n    @Action(DeselectAllEntries)\n    deselectAllEntries(ctx: StateContext<DriveStateModel>) {\n        if (!ctx.getState().selectedEntries.length) return;\n        ctx.patchState({selectedEntries: []});\n    }\n\n    @Action(SelectAllEntries)\n    SelectAllEntries(ctx: StateContext<DriveStateModel>) {\n        ctx.patchState({selectedEntries: ctx.getState().entries.slice()});\n    }\n\n    @Action(EntryTapped)\n    entryTapped(ctx: StateContext<DriveStateModel>, action: EntryTapped) {\n        const current = ctx.getState().selectedEntries.slice();\n        let alreadySelected = false;\n\n        // remove entry with matching ID (if exists) to avoid duplicates\n        const i = current.findIndex(curr => curr.id === action.entry.id);\n        if (i > -1) {\n            current.splice(i, 1);\n            alreadySelected = true;\n        }\n\n        if (action.ctrlKey) {\n            if (alreadySelected) {\n                ctx.patchState({selectedEntries: current});\n            } else {\n                ctx.patchState({selectedEntries: [...current, action.entry]});\n            }\n        } else {\n            ctx.patchState({selectedEntries: [action.entry]});\n        }\n\n        if (ctx.getState().isMobile) {\n            this.entryDoubleTapped(ctx, action);\n        }\n    }\n\n    @Action(EntryDoubleTapped)\n    entryDoubleTapped(ctx: StateContext<DriveStateModel>, action: EntryDoubleTapped) {\n        if (action.entry.type === 'folder') {\n            return ctx.dispatch(new OpenFolder(action.entry as DriveFolder));\n        } else {\n            return ctx.dispatch(new OpenFilePreview([action.entry]));\n        }\n    }\n\n    @Action(DeleteSelectedEntries)\n    deleteSelectedEntries(ctx: StateContext<DriveStateModel>) {\n        const entries = this.store.selectSnapshot(DriveState.selectedEntries),\n            entryIds = this.store.selectSnapshot(DriveState.selectedEntryIds),\n            flatFolders = this.store.selectSnapshot(DriveState.flatFolders),\n            activePage = ctx.getState().activePage;\n\n        return this.entriesApi.delete({entryIds}).pipe(\n            tap(() => {\n                // filter out deleted entries\n                const newEntries = ctx\n                    .getState()\n                    .entries.filter(entry => entryIds.indexOf(entry.id) === -1);\n\n                const newState = {entries: newEntries} as Partial<DriveStateModel>,\n                    actions = [new FileDeleteSuccess(entries)] as any[];\n\n                // clear selected entries\n                newState.selectedEntries = [];\n\n                // if selected folder was active, navigate to its parent\n                if (activePage.folder && entryIds.indexOf(activePage.folder.id) > -1) {\n                    this.store.dispatch(\n                        new OpenFolder(\n                            this.store.selectSnapshot(DriveState.selectedEntryParent)\n                        )\n                    );\n                }\n\n                // rebuild folders tree\n                const folders = entries.filter(entry => entry.type === 'folder');\n                if (folders.length) {\n                    folders.forEach(folder => delete flatFolders[folder.id]);\n                    newState.flatFolders = flatFolders;\n                    actions.push(new BuildFolderTree());\n                }\n\n                ctx.patchState(newState);\n                return ctx.dispatch(actions);\n            })\n        );\n    }\n\n    @Action(EntryContextMenuOpened)\n    fileContextMenuOpened(\n        ctx: StateContext<DriveStateModel>,\n        action: EntryContextMenuOpened\n    ) {\n        if (!action?.entry?.id) return;\n\n        const fileAlreadySelected = ctx\n            .getState()\n            .selectedEntries.find(entry => entry.id === action.entry.id);\n\n        if (!fileAlreadySelected) {\n            return ctx.dispatch(new EntrySelectedViaContextMenu([action.entry]));\n        }\n    }\n\n    @Action(NewFolderCreated)\n    newFolderCreated(ctx: StateContext<DriveStateModel>, action: NewFolderCreated) {\n        const state = ctx.getState();\n        const parentFolderId = action.folder.parent_id;\n\n        // start new folder into user folders cache\n        const newState: Partial<DriveStateModel> = {\n            flatFolders: [...state.flatFolders, action.folder],\n        };\n\n        // push new folder into parent folder entries, if parent is currently open\n        if (parentFolderId === state.activePage.folder.id) {\n            newState.entries = [action.folder, ...state.entries];\n        }\n\n        ctx.patchState(newState);\n\n        // rebuild folder tree\n        return ctx.dispatch(new BuildFolderTree());\n    }\n\n    @Action(EntryRenamed)\n    entryRenamed(ctx: StateContext<DriveStateModel>, action: EntryRenamed) {\n        const state = ctx.getState(),\n            newState = {entries: state.entries.slice()} as Partial<DriveStateModel>,\n            i = newState.entries.findIndex(curr => curr.id === action.entry.id);\n\n        // rename entry inside main entries array\n        if (i > -1) {\n            newState.entries[i] = {...newState.entries[i], name: action.newName};\n        }\n\n        // rename entry inside selected entries array\n        newState.selectedEntries = [{...state.selectedEntries[0], name: action.newName}];\n\n        // rename active folder\n        if (state.activePage.folder && state.activePage.folder.id === action.entry.id) {\n            newState.activePage = {...state.activePage, folder: action.entry};\n        }\n\n        // rebuild folder tree\n        if (action.entry.type === 'folder') {\n            const flatFolders = {...state.flatFolders};\n            flatFolders[action.entry.id] = {\n                ...flatFolders[action.entry.id],\n                name: action.newName,\n            };\n            newState.flatFolders = flatFolders;\n            ctx.dispatch(new BuildFolderTree());\n        }\n\n        ctx.patchState(newState);\n    }\n\n    @Action(StartedDragging)\n    startedDragging(ctx: StateContext<DriveStateModel>) {\n        ctx.patchState({dragging: true});\n    }\n\n    @Action(StoppedDragging)\n    stoppedDragging(ctx: StateContext<DriveStateModel>) {\n        ctx.patchState({dragging: false});\n    }\n\n    @Action(MoveEntries)\n    movieEntries(ctx: StateContext<DriveStateModel>, action: MoveEntries) {\n        const entries = action.entries || ctx.getState().selectedEntries;\n\n        if (!DriveState.canMoveEntriesTo(entries, action.destination)) return;\n\n        ctx.dispatch(new ShowLoadingToast(LoadingToastMessages.moveEntries));\n\n        const oldLocation = entries[0].parent_id;\n\n        return this.entriesApi\n            .moveEntries({\n                entryIds: entries.map(entry => entry.id),\n                destination: action.destination?.id,\n            })\n            .pipe(\n                finalize(() => ctx.dispatch(new HideLoadingToast())),\n                tap(\n                    response => {\n                        return ctx.dispatch(\n                            new MoveEntriesSuccess(\n                                action.destination?.id,\n                                oldLocation,\n                                response.entries\n                            )\n                        );\n                    },\n                    (errResponse: BackendErrorResponse) => {\n                        return ctx.dispatch(new MoveEntriesFailed(errResponse.errors));\n                    }\n                )\n            );\n    }\n\n    @Action(MoveEntriesSuccess)\n    moveEntriesSuccess(ctx: StateContext<DriveStateModel>, action: MoveEntriesSuccess) {\n        const state = ctx.getState(),\n            entryIds = action.entries.map(entry => entry.id),\n            folders = action.entries.filter(entry => entry.type === 'folder');\n\n        // remove moved entries from old folder\n        const newState = {\n            selectedEntries: [],\n            entries: state.entries.filter(entry => entryIds.indexOf(entry.id) === -1),\n        } as Partial<DriveStateModel>;\n\n        // rebuild folder tree\n        if (folders.length) {\n            newState.flatFolders = {...state.flatFolders};\n            action.entries\n                .filter(entry => entry.type === 'folder')\n                .forEach(\n                    entry => (newState.flatFolders[entry.id] = entry as DriveFolder)\n                );\n        }\n\n        // update active folder\n        if (state.activePage.folder) {\n            const folder = action.entries.find(\n                entry => state.activePage.folder.id === entry.id\n            );\n            if (folder) newState.activePage = {...state.activePage, folder};\n        }\n\n        ctx.patchState(newState);\n        return ctx.dispatch(new BuildFolderTree());\n    }\n\n    @Action(SetViewMode)\n    setViewMode(ctx: StateContext<DriveStateModel>, action: SetViewMode) {\n        this.localStore.set(VIEW_MODE_KEY, action.mode);\n        ctx.patchState({viewMode: action.mode});\n    }\n\n    @Action(ToggleDetailsSidebar)\n    toggleDetailsSidebar(ctx: StateContext<DriveStateModel>) {\n        ctx.patchState({\n            detailsVisible: !ctx.getState().detailsVisible,\n        });\n    }\n\n    @Action(ToggleSidebar)\n    toggleSidebar(ctx: StateContext<DriveStateModel>) {\n        ctx.patchState({\n            sidebarOpen: !ctx.getState().sidebarOpen,\n        });\n    }\n\n    @Action(AddEntries)\n    addEntries(ctx: StateContext<DriveStateModel>, action: AddEntries) {\n        const currentEntries = ctx.getState().entries,\n            spaceUsage = ctx.getState().spaceUsage;\n\n        const newEntries = action.entries.filter(\n            entry => !currentEntries.find(curr => curr.id === entry.id)\n        );\n\n        const newSize = newEntries\n            .filter(entry => entry.type !== 'folder')\n            .reduce((sum, entry) => sum + entry.file_size, 0);\n\n        ctx.patchState({\n            entries: [...newEntries, ...currentEntries],\n            spaceUsage: {...spaceUsage, used: spaceUsage.used + newSize},\n        });\n    }\n\n    @Action(UploadFiles)\n    uploadFiles(ctx: StateContext<DriveStateModel>, action: UploadFiles) {\n        if (!this.enoughSpaceLeftToUpload(ctx.getState().spaceUsage, action.files)) {\n            return ctx.dispatch(new NotEnoughSpaceError());\n        }\n\n        if (!action.files.length) return;\n\n        ctx.dispatch(new OpenUploadsPanel());\n\n        const state = ctx.getState();\n        const destinationPage = state.activePage;\n        const destinationId = destinationPage.folder.id || null;\n\n        const config = {\n            httpParams: {parentId: destinationId},\n            validator: this.validator,\n        };\n\n        return this.uploads.start(action.files, config).pipe(\n            tap(response => {\n                // get parent folders, if user has uploaded folders and not single files\n                const entries = [...response.fileEntry.all_parents, response.fileEntry];\n\n                // remove all entries that are not direct child of currently open folder\n                const newEntries = entries.filter(\n                    newEntry => newEntry && newEntry.parent_id === destinationId\n                );\n                const currentPage = ctx.getState().activePage;\n\n                // add newly uploaded files and created folders\n                if (currentPage.folder && currentPage.folder.id === destinationId) {\n                    ctx.dispatch(new AddEntries(newEntries as DriveEntry[]));\n                }\n\n                // rebuild folder tree, if there are any folders\n                const folders = entries.filter(entry => entry && entry.type === 'folder');\n                if (folders.length) {\n                    const flatFolders = [\n                        ...ctx.getState().flatFolders,\n                        ...folders,\n                    ] as DriveFolder[];\n                    ctx.patchState({flatFolders});\n                    ctx.dispatch(new BuildFolderTree());\n                }\n            })\n        );\n    }\n\n    @Action(DeleteTrashedEntriesForever)\n    deleteTrashedEntriesForever(ctx: StateContext<DriveStateModel>) {\n        const selectedEntries = this.store.selectSnapshot(DriveState.selectedEntries),\n            entryIds = selectedEntries.map(entry => entry.id);\n\n        const newEntries = ctx\n            .getState()\n            .entries.filter(entry => entryIds.indexOf(entry.id) === -1);\n\n        return this.entriesApi.delete({entryIds, deleteForever: true}).pipe(\n            tap(() => {\n                ctx.patchState({\n                    entries: newEntries,\n                    selectedEntries: [],\n                });\n\n                return ctx.dispatch([\n                    new TrashedEntriesDeleteSuccess(selectedEntries),\n                    new UserSpaceUsageChanged(),\n                ]);\n            })\n        );\n    }\n\n    @Action(RestoreTrashedEntries)\n    restoreTrashedEntries(\n        ctx: StateContext<DriveStateModel>,\n        action: RestoreTrashedEntries\n    ) {\n        const activePage = this.store.selectSnapshot(DriveState.activePage);\n        const restoredEntries =\n            action.entries || this.store.selectSnapshot(DriveState.selectedEntries);\n        const entryIds = restoredEntries.map(entry => entry.id);\n        let newEntries: DriveEntry[];\n\n        if (activePage.name === TRASH_PAGE.name) {\n            newEntries = ctx\n                .getState()\n                .entries.filter(entry => entryIds.indexOf(entry.id) === -1);\n        } else {\n            newEntries = [...ctx.getState().entries, ...action.entries];\n        }\n\n        return this.entriesApi.restore({entryIds}).pipe(\n            tap(() => {\n                ctx.patchState({\n                    entries: newEntries,\n                    selectedEntries: [],\n                });\n\n                return ctx.dispatch(new TrashedEntriesRestoreSuccess(restoredEntries));\n            })\n        );\n    }\n\n    @Action(EmptyTrash, {cancelUncompleted: true})\n    emptyTrash(ctx: StateContext<DriveStateModel>) {\n        ctx.dispatch(new ShowLoadingToast(LoadingToastMessages.emptyTrash));\n\n        return this.entriesApi.emptyTrash().pipe(\n            finalize(() => ctx.dispatch(new HideLoadingToast())),\n            tap(() => {\n                ctx.patchState({\n                    entries: [],\n                    selectedEntries: [],\n                });\n\n                return ctx.dispatch(new UserSpaceUsageChanged());\n            })\n        );\n    }\n\n    @Action(AddStar, {cancelUncompleted: true})\n    addStar(ctx: StateContext<DriveStateModel>, action: AddStar) {\n        const state = ctx.getState();\n        const ids = action.entries.map(entry => entry.id);\n\n        return this.entriesApi.addStar(ids).pipe(\n            tap(response => {\n                const newEntries = state.entries.map(entry => {\n                    if (ids.indexOf(entry.id) > -1) {\n                        if (!entry.tags) entry.tags = [];\n                        entry.tags.push(response.tag);\n                    }\n                    return entry;\n                });\n\n                const selectedEntries = state.selectedEntries.map(entry => {\n                    entry.tags.push(response.tag);\n                    return entry;\n                });\n\n                ctx.patchState({\n                    entries: newEntries,\n                    selectedEntries,\n                });\n            })\n        );\n    }\n\n    @Action(RemoveStar, {cancelUncompleted: true})\n    removeStar(ctx: StateContext<DriveStateModel>, action: RemoveStar) {\n        const state = ctx.getState(),\n            ids = action.entries.map(entry => entry.id);\n\n        return this.entriesApi.removeStar(ids).pipe(\n            tap(response => {\n                const newEntries = state.entries.map(entry => {\n                    if (ids.indexOf(entry.id) > -1) this.removeTag(entry, response.tag);\n                    return entry;\n                });\n\n                const selectedEntries = state.selectedEntries.map(entry =>\n                    this.removeTag(entry, response.tag)\n                );\n\n                ctx.patchState({\n                    entries: newEntries,\n                    selectedEntries,\n                });\n            })\n        );\n    }\n\n    @Action(RemoveEntries)\n    removeEntries(ctx: StateContext<DriveStateModel>, action: RemoveEntries) {\n        const ids = action.entries.map(entry => entry.id);\n        const newEntries = ctx\n            .getState()\n            .entries.filter(entry => ids.indexOf(entry.id) === -1);\n        ctx.patchState({\n            entries: newEntries,\n        });\n        this.toast.open({\n            message: 'Removed :count items.',\n            replacements: {count: ids.length},\n        });\n    }\n\n    @Action(CopySelectedEntries)\n    copySelectedEntries(ctx: StateContext<DriveStateModel>) {\n        const entries = this.store.selectSnapshot(DriveState.selectedEntries),\n            entryIds = entries.map(entry => entry.id),\n            folders = entries.filter(entry => entry.type === 'folder'),\n            oldState = ctx.getState();\n\n        if (!this.enoughSpaceLeftToUpload(ctx.getState().spaceUsage, entries)) {\n            return ctx.dispatch(new NotEnoughSpaceError());\n        }\n\n        ctx.dispatch(new ShowLoadingToast(LoadingToastMessages.copyEntries));\n\n        return this.entriesApi.copy({entryIds}).pipe(\n            finalize(() => ctx.dispatch(new HideLoadingToast())),\n            tap(response => {\n                const newState = {} as Partial<DriveStateModel>;\n\n                // show copied entries, if we are in a folder view\n                if (ctx.getState().activePage.folder) {\n                    newState.entries = oldState.entries.concat(response.entries);\n                }\n\n                // rebuild folder tree\n                if (folders.length) {\n                    newState.flatFolders = {...oldState.flatFolders};\n                    response.entries\n                        .filter(folder => folder.type === 'folder')\n                        .forEach(folder =>\n                            newState.flatFolders.push(folder as DriveFolder)\n                        );\n                }\n\n                ctx.patchState(newState);\n\n                // update user space usage\n                ctx.dispatch(new UserSpaceUsageChanged());\n\n                // rebuild folder tree\n                if (folders.length) ctx.dispatch(new BuildFolderTree());\n\n                const activePage = this.store.selectSnapshot(DriveState.activePage);\n                const location =\n                    activePage.name === DRIVE_PAGE_NAMES.SHARES\n                        ? `${this.workspaces.activeWorkspace$.value.name} workspace`\n                        : activePage.folder.name;\n                this.toast.open({\n                    message: `Copied :count file(s) into :location.`,\n                    replacements: {count: entryIds.length, location},\n                });\n            })\n        );\n    }\n\n    @Action(OpenUploadWindow)\n    openUploadWindow(ctx: StateContext<DriveStateModel>, action: OpenUploadWindow) {\n        const config = {\n            ...this.uploadInputConfig,\n            directory: action.type === 'directory',\n        };\n\n        openUploadWindow(config).then(files => {\n            if (!files || !files.length) return;\n            ctx.dispatch(new UploadFiles(files));\n        });\n    }\n\n    @Action(LoadUserSpaceUsage)\n    @Action(UserSpaceUsageChanged)\n    loadUserSpaceUsage(ctx: StateContext<DriveStateModel>) {\n        return this.entriesApi.getSpaceUsage().pipe(\n            tap(spaceUsage => {\n                ctx.patchState({\n                    spaceUsage: {used: spaceUsage.used, available: spaceUsage.available},\n                });\n            })\n        );\n    }\n\n    @Action(UpdateEntries)\n    updateEntries(ctx: StateContext<DriveStateModel>, action: UpdateEntries) {\n        const mainEntries = ctx.getState().entries.slice(),\n            selectedEntries = ctx.getState().selectedEntries.slice();\n\n        action.entries.forEach(updatedEntry => {\n            // update main entries\n            const mainIndex = mainEntries.findIndex(\n                entry => updatedEntry.id === entry.id\n            );\n            mainEntries[mainIndex] = {...mainEntries[mainIndex], ...updatedEntry};\n\n            // update selected entries\n            const selectedIndex = selectedEntries.findIndex(\n                entry => updatedEntry.id === entry.id\n            );\n            if (selectedIndex > -1) {\n                selectedEntries[selectedIndex] = {\n                    ...selectedEntries[selectedIndex],\n                    ...updatedEntry,\n                };\n            }\n        });\n\n        ctx.patchState({entries: mainEntries, selectedEntries});\n    }\n\n    @Action(UpdateEntryDescription)\n    updateEntryDescription(\n        ctx: StateContext<DriveStateModel>,\n        {entry, description}: UpdateEntryDescription\n    ) {\n        return this.entriesApi.update(entry.id, {description}).pipe(\n            tap(response => {\n                ctx.dispatch(new UpdateEntries([response.fileEntry]));\n            })\n        );\n    }\n\n    @Action(BreakpointChanged)\n    breakpointChanged(ctx: StateContext<DriveStateModel>, action: BreakpointChanged) {\n        ctx.patchState({\n            isMobile: action.status.isMobile,\n            sidebarOpen: !action.status.isMobile,\n            detailsVisible: !action.status.isMobile,\n        });\n    }\n\n    @Action(SetCurrentUser)\n    setCurrentUser(ctx: StateContext<DriveStateModel>, action: SetCurrentUser) {\n        ctx.patchState({currentUser: action.user});\n    }\n\n    @Action(SetWorkspace)\n    setWorkspace(ctx: StateContext<DriveStateModel>, action: SetWorkspace) {\n        ctx.patchState({activeWorkspace: action.workspace});\n    }\n\n    @Action(ResetState)\n    resetState(ctx: StateContext<DriveStateModel>) {\n        ctx.setState({...DRIVE_STATE_MODEL_DEFAULTS, viewMode: ctx.getState().viewMode});\n    }\n\n    private transformQueryParams(params: DriveApiIndexParams): DriveApiIndexParams {\n        const page = this.store.selectSnapshot(DriveState.activePage),\n            meta = this.store.selectSnapshot(DriveState.meta);\n\n        const queryParams = {\n            orderBy: meta.sortColumn,\n            orderDir: meta.sortDirection,\n            ...params,\n        };\n\n        if (page.name === DRIVE_PAGE_NAMES.FOLDER) {\n            queryParams.folderId = page.folderHash;\n        }\n        if (meta.query) queryParams.query = meta.query;\n        if (meta.filters) queryParams.filters = meta.filters;\n\n        return queryParams;\n    }\n\n    /**\n     * Check if user has enough space left to upload all specified files.\n     */\n    private enoughSpaceLeftToUpload(\n        spaceUsage: UserSpaceUsage,\n        files: (UploadedFile | FileEntry)[]\n    ) {\n        const newSize = files.reduce((sum, file) => {\n            const size = hasKey('size', file) ? file.size : file.file_size;\n            return sum + size;\n        }, 0);\n        const currentlyUsing = spaceUsage.used;\n        const availableSpace = spaceUsage.available;\n        return newSize + currentlyUsing < availableSpace;\n    }\n\n    private removeTag(entry: DriveEntry, tag: Tag) {\n        entry.tags = entry.tags.filter(t => t.id !== tag.id);\n        return entry;\n    }\n\n    static canMoveEntriesTo(movingEntries: DriveEntry[], destination?: DriveFolder) {\n        if (destination && destination.type !== 'folder') return false;\n\n        // should not be able to move folder into it's\n        // own child or same folder it's already in\n        return movingEntries.every(entry => {\n            // entry is already in this folder\n            if (destination?.id === entry.parent_id) return false;\n\n            // trying to move folder into it's own child\n            if (destination && destination.path.startsWith(entry.path)) return false;\n\n            return true;\n        });\n    }\n}\n","import { DriveFolder } from '../../folders/models/driveFolder';\n\nexport function buildFolderTree(folders: DriveFolder[]) {\n    const hashTable = {}; const tree = [];\n\n    for (let i = 0, len = folders.length; i < len; i++) {\n        const folder = folders[i];\n        // clear children from previous builds, to prevent duplicates\n        folder.children = [];\n        hashTable[folder.id] = folder;\n    }\n\n    for (const treeHash in hashTable) {\n        if ( ! hashTable.hasOwnProperty(treeHash)) continue;\n        const folder = hashTable[treeHash];\n        if (folder.parent_id) {\n            const parent = hashTable[folder.parent_id];\n            if (parent) {\n                parent.children.push(folder);\n            }\n        } else {\n            tree.push(folder);\n        }\n    }\n\n    return tree;\n}\n","export const SUPPORTED_ENTRY_TYPES = [\n    'audio',\n    'video',\n    'text',\n    'pdf',\n    'archive',\n    'folder',\n    'shared-folder',\n    'image',\n    'powerPoint',\n    'word',\n    'spreadsheet',\n];\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, OnChanges } from '@angular/core';\nimport { SUPPORTED_ENTRY_TYPES } from '../../../entries/supported-entry-types';\nimport { kebabCase } from '@common/core/utils/kebab-case';\n\n@Component({\n    selector: 'file-icon',\n    templateUrl: './file-icon.component.html',\n    styleUrls: ['./file-icon.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FileIconComponent implements OnChanges {\n    @Input() type: string;\n    @Input() mime: string;\n\n    ngOnChanges() {\n        if ( ! this.type && this.mime) {\n            this.type = this.mime.split('/')[0];\n        }\n        if ( ! SUPPORTED_ENTRY_TYPES.includes(this.type)) {\n            this.type = 'default';\n        }\n    }\n\n    public getType() {\n        return kebabCase(this.type);\n    }\n}\n","import { snakeCase } from './snake-case';\n\nexport function kebabCase(text: string) {\n    return snakeCase(text).replace('_', '-');\n}\n","<mat-icon\n        [svgIcon]=\"getType() + '-file-custom'\"\n        class=\"file-color\"\n        [ngClass]=\"getType() + '-file'\"\n></mat-icon>","<ng-container *ngIf=\"entries | async as selectedEntries\">\n    <ng-container *ngIf=\"selectedEntries[0]\">\n        <file-icon [type]=\"selectedEntries[0].type\"></file-icon>\n        <div class=\"text\">{{selectedEntries[0].name}}</div>\n        <div class=\"selected-entry-count\" *ngIf=\"selectedEntries.length > 1\">{{selectedEntries.length}}</div>\n    </ng-container>\n</ng-container>","import { Component, ViewEncapsulation, ChangeDetectionStrategy, HostBinding } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DriveEntry } from '../../files/models/drive-entry';\n\n@Component({\n    selector: 'entry-drag-preview',\n    templateUrl: './entry-drag-preview.component.html',\n    styleUrls: ['./entry-drag-preview.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntryDragPreviewComponent {\n    @Select(DriveState.selectedEntries) entries: Observable<DriveEntry[]>;\n    @HostBinding('class') className = 'files-grid-item-footer';\n    @HostBinding('class.hidden') get dragging() {\n        return !this.store.selectSnapshot(DriveState.dragging);\n    }\n\n    constructor(private store: Store) {}\n}\n","export interface DriveEntryPermissions {\n    edit?: boolean;\n    view?: boolean;\n    download?: boolean;\n}\n\nexport const DRIVE_ENTRY_FULL_PERMISSIONS = {\n    edit: true,\n    view: true,\n    download: true,\n};\n","import { Injectable } from '@angular/core';\nimport { AppHttpClient } from '@common/core/http/app-http-client.service';\nimport { DriveEntryUser } from '../files/models/drive-entry';\nimport { DriveEntryPermissions } from '../permissions/drive-entry-permissions';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { FileEntry } from '@common/uploads/types/file-entry';\n\nexport interface DriveEntryApiParams {\n    entries: FileEntry[];\n    emails: string[];\n    permissions: DriveEntryPermissions;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class SharesApiService {\n    constructor(private http: AppHttpClient) {}\n\n    public changePermissions(userId: number, entryIds: number[], permissions: DriveEntryPermissions): BackendResponse<{users: DriveEntryUser[]}> {\n        return this.http.put(`drive/shares/change-permissions/${userId}`, {permissions, entryIds});\n    }\n\n    /**\n     * Attach specified users to entries.\n     */\n    public shareEntries(params: DriveEntryApiParams): BackendResponse<{users: DriveEntryUser[]}> {\n        return this.http.post('drive/shares/add-users', {\n            ...params,\n            entryIds: params.entries.map(entry => entry.id)\n        });\n    }\n\n    /**\n     * Detach specified user from entries.\n     */\n    public detachUser(userId: number, entryIds: number[]): BackendResponse<{users: DriveEntryUser[]}> {\n        return this.http.post('drive/shares/remove-user/' + userId, {entryIds});\n    }\n}\n","import { Action, Selector, State, StateContext, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { DriveEntryUser } from '../../files/models/drive-entry';\nimport { DriveEntryPermissions } from '../../permissions/drive-entry-permissions';\nimport { finalize, tap } from 'rxjs/operators';\nimport { SharesApiService } from '../shares-api.service';\nimport isEqual from 'lodash/isEqual';\nimport cloneDeep from 'lodash/cloneDeep';\nimport uniqBy from 'lodash/uniqBy';\nimport {\n    BackendErrorMessages, BackendErrorResponse\n} from '@common/core/types/backend-error-response';\nimport { ShareDialogEntryPermissions } from '../share-dialog/types/ShareDialogEntryPermissions';\nimport { UpdateEntries } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\n\nexport class SetInitialUsers {\n    static readonly type = '[ShareDialog] Set Initial Users';\n}\n\nexport class UpdateUserPermissions {\n    static readonly type = '[ShareDialog] Update User Permissions';\n    constructor(public user: DriveEntryUser, public permissions: DriveEntryPermissions) {}\n}\n\nexport class RemoveUser {\n    static readonly type = '[ShareDialog] Remove User';\n    constructor(public user: DriveEntryUser) {}\n}\n\nexport class SetUsers {\n    static readonly type = '[ShareDialog] Set Users';\n    constructor(public users: DriveEntryUser[]) {}\n}\n\nexport class ResetState {\n    static readonly type = '[ShareDialog] Reset';\n}\n\nexport class ShareEntries {\n    static readonly type = '[ShareDialog] Share Entries';\n    constructor(public payload: {emails: string[], permissions: DriveEntryPermissions}) {}\n}\n\nexport class ShareEntriesFailed {\n    static readonly type = '[ShareDialog] Share Entries Failed';\n    constructor(public messages: BackendErrorMessages) {}\n}\n\nexport interface ShareDialogEntryUser extends DriveEntryUser {\n    removed?: boolean;\n    entry_permissions: ShareDialogEntryPermissions;\n}\n\nexport interface ShareDialogStateModel {\n    loading: boolean;\n    loadingUsers: number[];\n    original: ShareDialogEntryUser[];\n    usersWithAccess: ShareDialogEntryUser[];\n}\n\n@State<ShareDialogStateModel>({\n    name: 'shareDialog',\n    defaults: {\n        usersWithAccess: [],\n        original: [],\n        loading: false,\n        loadingUsers: [],\n    }\n})\n@Injectable()\nexport class ShareDialogState {\n    constructor(\n        private store: Store,\n        private sharesApi: SharesApiService\n    ) {}\n\n    @Selector()\n    static usersWithAccess(state: ShareDialogStateModel) {\n        return state.usersWithAccess;\n    }\n\n    @Selector()\n    static dirty(state: ShareDialogStateModel) {\n        return !isEqual(state.original, state.usersWithAccess);\n    }\n\n    @Selector()\n    static loading(state: ShareDialogStateModel) {\n        return state.loading;\n    }\n\n    @Selector()\n    static loadingUsers(state: ShareDialogStateModel) {\n        return state.loadingUsers;\n    }\n\n    @Action(SetInitialUsers)\n    setInitialUsers(ctx: StateContext<ShareDialogStateModel>) {\n        const entries = this.store.selectSnapshot(DriveState.selectedEntries);\n\n        let users = entries\n            .map(entry => entry.users)\n            .reduce((all, curr) => all.concat(curr), []);\n\n        // make sure we don't override anything in main drive store\n        users = cloneDeep(users);\n        users = users.filter(user => !!user);\n\n        // multiple entries might contain same users\n        const uniqueUsers = uniqBy(users, user => user.id) as ShareDialogEntryUser[];\n\n        // if permissions for same user are not same on\n        // all selected entries, show \"varies\" permission\n        if (entries.length > 1) {\n            uniqueUsers.forEach(user => {\n                const permissions = entries\n                    .map(entry => entry.users.find(u => u.id === user.id))\n                    .filter(u => !!u)\n                    .map(u => Object.assign({}, u.entry_permissions));\n\n                if (entries.length !== permissions.length || permissions.some(p => !isEqual(p, permissions[0]))) {\n                    user.entry_permissions = {varies: true};\n                }\n            });\n        }\n\n        ctx.patchState({\n            usersWithAccess: cloneDeep(uniqueUsers),\n            original: uniqueUsers,\n        });\n    }\n\n    @Action(SetUsers)\n    setUsers(ctx: StateContext<ShareDialogStateModel>, action: SetUsers) {\n        ctx.patchState({\n            usersWithAccess: action.users,\n            original: cloneDeep(action.users)\n        });\n    }\n\n    @Action(UpdateUserPermissions)\n    updateUserPermissions(ctx: StateContext<ShareDialogStateModel>, action: UpdateUserPermissions) {\n        this.toggleUserLoading(ctx, action.user.id, true);\n        const entryIds = this.store.selectSnapshot(DriveState.selectedEntries).map(e => e.id);\n        const userId = action.user.id;\n        return this.sharesApi.changePermissions(userId, entryIds, action.permissions).pipe(\n            finalize(() => this.toggleUserLoading(ctx, action.user.id, false)),\n            tap(response => this.updateUsers(ctx, response.users))\n        );\n    }\n\n    @Action(RemoveUser)\n    removeUser(ctx: StateContext<ShareDialogStateModel>, action: RemoveUser) {\n        this.toggleUserLoading(ctx, action.user.id, true);\n        return this.sharesApi.detachUser(\n            action.user.id,\n            this.store.selectSnapshot(DriveState.selectedEntries).map(e => e.id)\n        ).pipe(\n            finalize(() => this.toggleUserLoading(ctx, action.user.id, false)),\n            tap(response => this.updateUsers(ctx, response.users))\n        );\n    }\n\n    @Action(ResetState)\n    resetState(ctx: StateContext<ShareDialogStateModel>) {\n       ctx.setState({\n           loading: false,\n           usersWithAccess: [],\n           original: [],\n           loadingUsers: [],\n       });\n    }\n\n    @Action(ShareEntries, {cancelUncompleted: true})\n    shareEntries(ctx: StateContext<ShareDialogStateModel>, action: ShareEntries) {\n        ctx.patchState({loading: true});\n\n        const payload = {\n            ...action.payload,\n            entries: this.store.selectSnapshot(DriveState.selectedEntries)\n        };\n\n        return this.sharesApi.shareEntries(payload)\n            .pipe(\n                finalize(() => ctx.patchState({loading: false})),\n                tap(response => {\n                    ctx.dispatch(new SetUsers(response.users));\n                    this.updateEntriesInDriveStore(response.users);\n                }, (errorResponse: BackendErrorResponse) => {\n                    ctx.dispatch(new ShareEntriesFailed(errorResponse.errors));\n                })\n            );\n    }\n\n    private toggleUserLoading(ctx: StateContext<ShareDialogStateModel>, userId: number, isLoading: boolean) {\n        if (isLoading) {\n            ctx.patchState({loadingUsers: [...ctx.getState().loadingUsers, userId]});\n        } else {\n            ctx.patchState({loadingUsers: ctx.getState().loadingUsers.filter(u => u !== userId)});\n        }\n    }\n\n    private updateUsers(ctx, newUsers: DriveEntryUser[]) {\n        ctx.patchState({\n            usersWithAccess: newUsers,\n            original: cloneDeep(newUsers),\n        });\n        this.updateEntriesInDriveStore(newUsers);\n    }\n\n    private updateEntriesInDriveStore(newUsers: DriveEntryUser[]) {\n        const entries = this.store.selectSnapshot(DriveState.selectedEntries);\n\n        // update permissions in main drive store, otherwise we'll get old\n        // permissions if user re-opens share dialog without page reload\n        const updatedEntries = entries.map(entry => {\n            entry.users = newUsers;\n            return entry;\n        });\n\n        this.store.dispatch(new UpdateEntries(updatedEntries));\n    }\n}\n","<button mat-flat-button color=\"gray\" [matMenuTriggerFor]=\"shareMenu\" [disabled]=\"(loadingUsers$ | async).includes(user?.id)\">\n    <ng-container *ngIf=\"overallPermission() === 'varies'\">\n        <mat-icon class=\"button-icon\" svgIcon=\"priority-high\"></mat-icon>\n        <span class=\"button-text\" trans>Varies</span>\n    </ng-container>\n\n    <ng-container *ngIf=\"overallPermission() === 'edit'\">\n        <mat-icon class=\"button-icon\" svgIcon=\"edit\"></mat-icon>\n        <span class=\"button-text\" trans>Can edit</span>\n    </ng-container>\n\n    <ng-container *ngIf=\"overallPermission() === 'view'\">\n        <mat-icon class=\"button-icon\" svgIcon=\"remove-red-eye\"></mat-icon>\n        <span class=\"button-text\" trans>Can View</span>\n    </ng-container>\n\n    <ng-container *ngIf=\"overallPermission() === 'download'\">\n        <mat-icon class=\"button-icon\" svgIcon=\"file-download\"></mat-icon>\n        <span class=\"button-text\" trans>Can Download</span>\n    </ng-container>\n\n    <mat-icon class=\"dropdown-icon\" svgIcon=\"arrow-drop-down\"></mat-icon>\n</button>\n\n<mat-menu #shareMenu=\"matMenu\" classList=\"mat-menu-with-description\">\n    <div mat-menu-item (click)=\"selectPermission('edit')\">\n        <mat-icon class=\"mat-icon\" svgIcon=\"check\" [class.visually-hidden]=\"overallPermission() !== 'edit'\"></mat-icon>\n        <div>\n            <div trans>Can edit</div>\n            <div class=\"description\" trans>People can edit, delete and copy the item to their own drive.</div>\n        </div>\n    </div>\n    <div mat-menu-item (click)=\"selectPermission('download')\">\n        <mat-icon class=\"mat-icon\" svgIcon=\"check\" [class.visually-hidden]=\"overallPermission() !== 'download'\"></mat-icon>\n        <div>\n            <div trans>Can download</div>\n            <div class=\"description\" trans>People can view and download the item.</div>\n        </div>\n    </div>\n\n    <div mat-menu-item (click)=\"selectPermission('view')\">\n        <mat-icon class=\"mat-icon\" svgIcon=\"check\" [class.visually-hidden]=\"overallPermission() !== 'view'\"></mat-icon>\n        <div>\n            <div trans>Can view</div>\n            <div class=\"description\" trans>People can view the item.</div>\n        </div>\n    </div>\n</mat-menu>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    EventEmitter,\n    HostBinding,\n    Input,\n    Output,\n    ViewEncapsulation\n} from '@angular/core';\nimport {\n    DRIVE_ENTRY_FULL_PERMISSIONS, DriveEntryPermissions\n} from '../../permissions/drive-entry-permissions';\nimport { ShareDialogEntryPermissions } from '../share-dialog/types/ShareDialogEntryPermissions';\nimport { Select, Store } from '@ngxs/store';\nimport { SharesApiService } from '../shares-api.service';\nimport { Toast } from '../../../../common/core/ui/toast.service';\nimport {\n    ShareDialogEntryUser, ShareDialogState, UpdateUserPermissions\n} from '../state/share-dialog.state';\nimport { Observable } from 'rxjs';\n\n@Component({\n    selector: 'sharing-permissions-button',\n    templateUrl: './sharing-permissions-button.component.html',\n    styleUrls: ['./sharing-permissions-button.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SharingPermissionsButtonComponent {\n    @Input() permissions: ShareDialogEntryPermissions = DRIVE_ENTRY_FULL_PERMISSIONS;\n    @Input() user: ShareDialogEntryUser;\n    @Output() change: EventEmitter<DriveEntryPermissions> = new EventEmitter();\n    @Input() @HostBinding('class.compact') compact = false;\n    @Select(ShareDialogState.loadingUsers) loadingUsers$: Observable<number[]>;\n\n    constructor(\n        private store: Store,\n        private api: SharesApiService,\n        private toast: Toast,\n    ) {}\n\n    public overallPermission(): keyof ShareDialogEntryPermissions {\n        if (this.permissions.varies) {\n            return 'varies';\n        } else if (this.permissions.edit) {\n            return 'edit';\n        } else if (this.permissions.download) {\n            return 'download';\n        } else {\n            return 'view';\n        }\n    }\n\n    public selectPermission(permission: keyof ShareDialogEntryPermissions) {\n        if (permission === 'edit') {\n            this.permissions = {...DRIVE_ENTRY_FULL_PERMISSIONS};\n        } else if (permission === 'download') {\n            this.permissions = {...DRIVE_ENTRY_FULL_PERMISSIONS, edit: false};\n        } else {\n            this.permissions = {...DRIVE_ENTRY_FULL_PERMISSIONS, edit: false, download: false};\n        }\n\n        if (this.user) {\n            this.updateUserPermissions(this.permissions);\n        } else {\n            this.change.emit(this.permissions);\n        }\n    }\n\n    public updateUserPermissions(newPermissions: DriveEntryPermissions) {\n        this.store.dispatch(new UpdateUserPermissions(this.user, newPermissions))\n            .subscribe(() => {\n                this.toast.open('Changed permissions.');\n            });\n    }\n}\n","<div class=\"header\" trans>Who has access</div>\n<div class=\"users-list\">\n    <div class=\"list-item\" *ngIf=\"activeWorkspace$ | async as workspace\">\n        <mat-icon svgIcon=\"groups\" class=\"list-item-img\"></mat-icon>\n        <div class=\"text\">\n            <div class=\"display_name\" [transValues]=\"{workspace: workspace.name}\" trans>Everyone at \":workspace\" workspace</div>\n            <div class=\"email\">{{workspace.members_count}} {{ 'members' | trans }}</div>\n        </div>\n    </div>\n    <div class=\"list-item\" *ngFor=\"let user of users | async; trackBy: trackByUser\" [class.removed]=\"user.removed\" [@flyInOut]=\"'in'\">\n        <img [src]=\"user.avatar\" class=\"list-item-img\" alt=\"\">\n        <div class=\"text\">\n            <div class=\"display_name\">{{user.display_name}}</div>\n            <div class=\"email\">{{user.email}}</div>\n        </div>\n        <div class=\"actions\">\n            <span class=\"owner-label\" *ngIf=\"user.owns_entry || (currentUser.getModel().id === user.id); else permissionSelector\" trans>\n                {{ user.owns_entry ? 'Owner' : 'You' }}\n            </span>\n\n            <ng-template #permissionSelector>\n                <sharing-permissions-button [permissions]=\"user.entry_permissions\" [user]=\"user\"></sharing-permissions-button>\n                <button mat-icon-button [disabled]=\"(loadingUsers$ | async).includes(user.id)\" (click)=\"removeUser(user)\">\n                    <mat-icon svgIcon=\"close\"></mat-icon>\n                </button>\n            </ng-template>\n        </div>\n    </div>\n</div>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { Observable } from 'rxjs';\nimport { DriveEntryUser } from '../../files/models/drive-entry';\nimport {\n    RemoveUser, ShareDialogEntryUser, ShareDialogState\n} from '../state/share-dialog.state';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport { CurrentUser } from '../../../../common/auth/current-user';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\nimport { DriveState } from '../../state/drive-state';\nimport { filter, map, switchMap } from 'rxjs/operators';\n\n@Component({\n    selector: 'entries-access-table',\n    templateUrl: './entries-access-table.component.html',\n    styleUrls: ['./entries-access-table.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: [\n        trigger('flyInOut', [\n            state('in', style({transform: 'translateX(0)'})),\n            transition('void => *', [\n                style({transform: 'translateX(-100%)'}),\n                animate(100)\n            ]),\n            transition('* => void', [\n                animate(100, style({transform: 'translateX(100%)'}))\n            ])\n        ])\n    ]\n})\nexport class EntriesAccessTableComponent {\n    @Select(ShareDialogState.usersWithAccess) users: Observable<ShareDialogEntryUser[]>;\n    @Select(ShareDialogState.loadingUsers) loadingUsers$: Observable<number[]>;\n    public activeWorkspace$ = this.store.select(DriveState.selectedEntries)\n        .pipe(\n            map(entries => entries.every(e => e.workspace_id)),\n            filter(x => !!x),\n            switchMap(() => this.workspaces.activeWorkspace$)\n        );\n\n    constructor(\n        private store: Store,\n        public currentUser: CurrentUser,\n        public workspaces: WorkspacesService,\n    ) {}\n\n    public removeUser(user: DriveEntryUser) {\n        this.store.dispatch(new RemoveUser(user));\n    }\n\n    trackByUser(index: number, user: DriveEntryUser): number { return user.id; }\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Add people</h2>\n    <button type=\"button\" mat-icon-button (click)=\"dialogRef.close()\" class=\"close-button\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<mat-dialog-content>\n    <div class=\"emails-container\">\n        <chip-input [formControl]=\"shareModel.emails\" [emailsInput]=\"true\" [suggestFn]=\"settings.get('share.suggest_emails') ? suggestUserEmails : null\" placeholder=\"Enter email addresses...\" email required></chip-input>\n        <sharing-permissions-button [compact]=\"true\" (change)=\"shareModel.permissions = $event\"></sharing-permissions-button>\n    </div>\n\n    <div class=\"errors\">\n        <div class=\"error\" *ngFor=\"let error of errors | async | keyvalue\">{{error.value}}</div>\n    </div>\n\n    <entries-access-table></entries-access-table>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n    <button type=\"button\" mat-button (click)=\"dialogRef.close()\" [disabled]=\"loading$ | async\" trans>Close</button>\n    <button type=\"submit\" mat-raised-button color=\"accent\" (click)=\"share()\" [disabled]=\"(loading$ | async)\" *ngIf=\"shareModel.emails.value?.length\" trans>Share</button>\n</mat-dialog-actions>\n\n","import { ChangeDetectionStrategy, Component, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Actions, ofActionDispatched, Select, Store } from '@ngxs/store';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { DRIVE_ENTRY_FULL_PERMISSIONS, DriveEntryPermissions } from '../../permissions/drive-entry-permissions';\nimport { ResetState, SetInitialUsers, ShareDialogState, ShareEntries, ShareEntriesFailed } from '../state/share-dialog.state';\nimport { FormControl } from '@angular/forms';\nimport { BackendErrorMessages } from '@common/core/types/backend-error-response';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { Users } from '@common/auth/users.service';\nimport { Settings } from '@common/core/config/settings.service';\n\n@Component({\n    selector: 'share-dialog',\n    templateUrl: './share-dialog.component.html',\n    styleUrls: ['./share-dialog.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ShareDialogComponent implements OnDestroy {\n    @Select(ShareDialogState.loading) loading$: Observable<boolean>;\n\n    private destroyed$ = new Subject();\n    public errors: BehaviorSubject<BackendErrorMessages> = new BehaviorSubject({});\n    public shareModel: { emails: FormControl, permissions: DriveEntryPermissions};\n\n    constructor(\n        public dialogRef: MatDialogRef<ShareDialogComponent>,\n        public settings: Settings,\n        private store: Store,\n        private actions$: Actions,\n        private users: Users,\n    ) {\n        this.resetModel();\n        this.store.dispatch(new SetInitialUsers());\n\n        this.bindToShareError();\n        this.bindToShareModel();\n    }\n\n    ngOnDestroy() {\n        this.store.dispatch(new ResetState());\n        this.destroyed$.next();\n        this.destroyed$.complete();\n    }\n\n    public share() {\n        const payload = {\n            emails: this.shareModel.emails.value,\n            permissions: this.shareModel.permissions,\n        };\n\n        this.store.dispatch(new ShareEntries(payload)).subscribe(() => {\n            this.setErrorMessages();\n            this.resetModel();\n        });\n    }\n\n    private resetModel() {\n        this.shareModel = {\n            emails: new FormControl([]),\n            permissions: DRIVE_ENTRY_FULL_PERMISSIONS\n        };\n    }\n\n    private setErrorMessages(messages?: BackendErrorMessages) {\n        this.errors.next(messages || {});\n    }\n\n    private bindToShareModel() {\n        this.shareModel.emails.valueChanges\n            .pipe(takeUntil(this.destroyed$))\n            .subscribe(() => this.setErrorMessages());\n    }\n\n    private bindToShareError() {\n        this.actions$.pipe(\n            takeUntil(this.destroyed$),\n            ofActionDispatched(ShareEntriesFailed)\n        ).subscribe((action: ShareEntriesFailed) => {\n            this.setErrorMessages(action.messages);\n        });\n    }\n\n    suggestUserEmails = (query: string): Observable<string[]> => {\n        return this.users.getAll({query, perPage: 7})\n            .pipe(map(users => users.map(u => u.email)));\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { BackendResponse } from '@common/core/types/backend-response';\nimport { ShareableLink } from './models/shareable-link';\nimport { AppHttpClient } from '@common/core/http/app-http-client.service';\nimport { ShareableLinkOptions } from './models/shareable-link-options';\nimport { User } from '@common/core/types/models/User';\nimport { PaginationResponse } from '@common/core/types/pagination/pagination-response';\nimport { FileEntry } from '@common/uploads/types/file-entry';\n\nexport interface GetLinkData {\n    link: ShareableLink;\n    folderChildren: PaginationResponse<FileEntry>;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class ShareableLinksApiService {\n    constructor(private http: AppHttpClient) {}\n\n    public findByEntryId(entryId: number, params: {autoCreate?: boolean}): BackendResponse<{ link: ShareableLink }> {\n        return this.http.get(`drive/entries/${entryId}/shareable-link`, params);\n    }\n\n    public findByHash(hash: string, params?: {withEntries?: boolean, page?: number, order?: string}): BackendResponse<GetLinkData> {\n        return this.http.get(`drive/shareable-links/${hash}`, params);\n    }\n\n    public create(entryId: number, params: Partial<ShareableLinkOptions>): BackendResponse<{ link: ShareableLink }> {\n        return this.http.post(`drive/entries/${entryId}/shareable-link`, params);\n    }\n\n    public update(id: number, params: Partial<ShareableLinkOptions>): BackendResponse<{ link: ShareableLink }> {\n        return this.http.put(`drive/shareable-links/${id}`, params);\n    }\n\n    public delete(id: number): BackendResponse<void> {\n        return this.http.delete(`drive/shareable-links/${id})`);\n    }\n\n    public checkPassword(linkId: number, password: string): BackendResponse<{matches: boolean}> {\n        return this.http.post(`drive/shareable-links/${linkId}/check-password`, {password});\n    }\n\n    /**\n     * Import shareable link entry into current user's drive.\n     */\n    public importEntry(linkId: number, password?: string): BackendResponse<{users: User[]}> {\n        return this.http.post(`drive/shareable-links/${linkId}/import`, {password});\n    }\n}\n","import { Action, Selector, State, StateContext, Store } from '@ngxs/store';\nimport { ShareableLinkOptions } from './models/shareable-link-options';\nimport { ShareableLinksApiService } from './shareable-links-api.service';\nimport { ShareableLink } from './models/shareable-link';\nimport { finalize, tap } from 'rxjs/operators';\nimport { DriveState } from '../../state/drive-state';\nimport { Settings } from '@common/core/config/settings.service';\nimport {\n    BackendErrorMessages, BackendErrorResponse\n} from '@common/core/types/backend-error-response';\nimport { Injectable } from '@angular/core';\n\nexport interface ShareLinkStateModel {\n    cache: {[key: number]: ShareableLink};\n    backendErrors: BackendErrorMessages;\n    link: ShareableLink;\n    loading: boolean;\n    linkOptions: ShareableLinkOptions;\n    optionsPanelVisible: boolean;\n}\n\nexport class LoadShareableLink {\n    static readonly type = '[Shareable Link] Load From Backend';\n    constructor(public options: {autoCreate?: boolean} = {}) {}\n}\n\nexport class UpdateShareableLink {\n    static readonly type = '[Shareable Link] Update';\n    constructor(public options: ShareableLinkOptions) {}\n}\n\nexport class CreateShareableLink {\n    static readonly type = '[Shareable Link] Create';\n    constructor(public options: ShareableLinkOptions) {}\n}\n\nexport class DeleteShareableLink {\n    static readonly type = '[Shareable Link] Delete';\n}\n\nexport class ToggleOptionsPanel {\n    static readonly type = '[Shareable Link] Toggle Options Panel Visibility';\n}\n\nexport class LinkCopySuccess {\n    static readonly type = '[Shareable Link] Copy To Clipboard Success';\n}\n\nexport class ResetShareLinkState {\n    static readonly type = '[Shareable Link] Reset State';\n}\n\nconst defaultState = {\n    link: null,\n    loading: false,\n    optionsPanelVisible: true,\n    backendErrors: {},\n    cache: {},\n    linkOptions: {\n        allowDownload: false,\n        allowEdit: false,\n        expiresAt: null,\n        password: null,\n    }\n};\n\n@State<ShareLinkStateModel>({\n    name: 'shareLink',\n    defaults: defaultState\n})\n@Injectable()\nexport class ShareLinkState {\n    constructor(\n        private store: Store,\n        private settings: Settings,\n        private linksApi: ShareableLinksApiService\n    ) {}\n\n    @Selector()\n    static loading(state: ShareLinkStateModel) {\n        return state.loading;\n    }\n\n    @Selector()\n    static link(state: ShareLinkStateModel) {\n        return state.link;\n    }\n\n    @Selector()\n    static optionsVisible(state: ShareLinkStateModel) {\n        return ! state.loading && state.optionsPanelVisible;\n    }\n\n    @Selector()\n    static backendErrors(state: ShareLinkStateModel) {\n        return state.backendErrors;\n    }\n\n    @Action(CreateShareableLink)\n    createShareableLink(ctx: StateContext<ShareLinkStateModel>, action: UpdateShareableLink) {\n        const entryId = this.store.selectSnapshot(DriveState.selectedEntryIds)[0];\n\n        ctx.patchState({loading: true});\n\n        return this.linksApi.create(entryId, action.options)\n            .pipe(\n                finalize(() => ctx.patchState({loading: false, backendErrors: {}})),\n                tap(response => {\n                    const link = response.link;\n                    ctx.patchState({\n                        cache: {...ctx.getState().cache, [link.entry_id]: link},\n                        link: response.link,\n                        optionsPanelVisible: false\n                    });\n                }, (errorResponse: BackendErrorResponse) => {\n                    ctx.patchState({backendErrors: errorResponse.errors});\n                })\n            );\n    }\n\n    @Action(UpdateShareableLink)\n    updateLink(ctx: StateContext<ShareLinkStateModel>, action: UpdateShareableLink) {\n        const link = ctx.getState().link;\n\n        ctx.patchState({loading: true});\n\n        return this.linksApi.update(link.id, action.options)\n            .pipe(\n                finalize(() => ctx.patchState({loading: false, backendErrors: {}})),\n                tap(response => ctx.patchState({\n                    link: response.link,\n                    cache: {...ctx.getState().cache, [link.entry_id]: response.link},\n                    optionsPanelVisible: false\n                }), (errorResponse: BackendErrorResponse) => {\n                    ctx.patchState({backendErrors: errorResponse.errors});\n                })\n            );\n    }\n\n    @Action(LoadShareableLink)\n    loadShareableLink(ctx: StateContext<ShareLinkStateModel>, action: LoadShareableLink) {\n        const entryId = this.store.selectSnapshot(DriveState.selectedEntryIds)[0],\n            cachedLink = ctx.getState().cache[entryId];\n\n        if (cachedLink) {\n            return ctx.patchState({link: cachedLink, optionsPanelVisible: false});\n        }\n\n        ctx.patchState({loading: true});\n\n        return this.linksApi.findByEntryId(entryId, {autoCreate: action.options.autoCreate})\n            .pipe(\n                finalize(() => ctx.patchState({loading: false})),\n                tap(response => ctx.patchState({\n                    link: response.link,\n                    optionsPanelVisible: false,\n                    cache: {...ctx.getState().cache, [response.link.entry_id]: response.link},\n                }), () => {})\n            );\n    }\n\n    @Action(DeleteShareableLink)\n    deleteShareableLink(ctx: StateContext<ShareLinkStateModel>) {\n        const link = ctx.getState().link;\n\n        ctx.patchState({loading: true});\n\n        return this.linksApi.delete(link.id)\n            .pipe(\n                finalize(() => ctx.patchState({loading: false})),\n                tap(() => {\n                    const cache = ctx.getState().cache;\n                    delete cache[link.entry_id];\n\n                    ctx.patchState({\n                        link: null,\n                        cache: cache,\n                    });\n                })\n            );\n    }\n\n    @Action(ToggleOptionsPanel)\n    toggleOptionsPanel(ctx: StateContext<ShareLinkStateModel>) {\n        ctx.patchState({\n           optionsPanelVisible: !ctx.getState().optionsPanelVisible\n        });\n    }\n\n    @Action(ResetShareLinkState, {cancelUncompleted: true})\n    resetShareLinkState(ctx: StateContext<ShareLinkStateModel>) {\n        return ctx.patchState({...ctx.getState(), ...defaultState});\n    }\n}\n","<form class=\"update-link-panel\" [formGroup]=\"form\" (ngSubmit)=\"saveChanges()\">\n    <div class=\"link-options\">\n        <div class=\"link-option\">\n            <div class=\"label\" trans>Link expiration</div>\n            <div class=\"content\">\n                <mat-checkbox color=\"accent\" [formControl]=\"expirationVisible\" trans>Link is valid until:</mat-checkbox>\n                <div class=\"input-container expiration-input-container\" formGroupName=\"expiresAt\"  [class.hidden]=\"!expirationVisible.value\">\n                    <div class=\"date-input-container\">\n                        <input type=\"date\" formControlName=\"date\" class=\"date-input\" placeholder=\"Expiration date...\" trans-placeholder [min]=\"getMinDate()\">\n                    </div>\n                    <input type=\"time\" class=\"time-input\" formControlName=\"time\" placeholder=\"Expiration time...\" trans-placeholder>\n                </div>\n                <div class=\"error\" *ngIf=\"(backendErrors$ | async)?.expiresAt as error\">{{error}}</div>\n            </div>\n        </div>\n        <div class=\"link-option\">\n            <div class=\"label\" trans>Password Protect</div>\n            <div class=\"content\">\n                <mat-checkbox color=\"accent\" [formControl]=\"passwordVisible\" trans>Require password:</mat-checkbox>\n                <ng-container *ngIf=\"passwordVisible.value\">\n                    <div class=\"input-container password-input-container\">\n                        <input type=\"password\" formControlName=\"password\" placeholder=\"Enter new password...\" trans-placeholder>\n                    </div>\n                </ng-container>\n            </div>\n        </div>\n        <div class=\"link-option\">\n            <div class=\"label\" trans>Allow editing</div>\n            <mat-checkbox color=\"accent\" formControlName=\"allowEdit\" trans>Users with link can modify this item.</mat-checkbox>\n        </div>\n        <div class=\"link-option\">\n            <div class=\"label\" trans>Allow download</div>\n            <mat-checkbox color=\"accent\" formControlName=\"allowDownload\" trans>Users with link can download this item.</mat-checkbox>\n        </div>\n    </div>\n\n    <button type=\"button\" (click)=\"toggleOptionsPanel()\" mat-button trans>Cancel</button>\n\n    <button type=\"submit\" class=\"update-button\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\">\n        {{ ((link$ | async) ? 'Update Link' : 'Create Link') | trans }}\n    </button>\n</form>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, OnInit } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { Select, Store } from '@ngxs/store';\nimport { CreateShareableLink, ShareLinkState, ToggleOptionsPanel, UpdateShareableLink } from '../share-link.state';\nimport { Observable } from 'rxjs';\nimport { ShareableLink } from '../models/shareable-link';\nimport { filter } from 'rxjs/operators';\nimport { ShareableLinkOptions } from '../models/shareable-link-options';\nimport { BackendErrorMessages } from '@common/core/types/backend-error-response';\n\n@Component({\n    selector: 'link-options',\n    templateUrl: './link-options.component.html',\n    styleUrls: ['./link-options.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LinkOptionsComponent implements OnInit {\n    @Select(ShareLinkState.link) link$: Observable<ShareableLink>;\n    @Select(ShareLinkState.loading) loading$: Observable<boolean>;\n    @Select(ShareLinkState.backendErrors) backendErrors$: Observable<BackendErrorMessages>;\n\n    public form = new FormGroup({\n        password: new FormControl(),\n        expiresAt: new FormGroup({\n            date: new FormControl(),\n            time: new FormControl(),\n        }),\n        allowEdit: new FormControl(false),\n        allowDownload: new FormControl(true)\n    });\n\n    public passwordVisible = new FormControl(false);\n    public expirationVisible = new FormControl(false);\n\n    constructor(private store: Store) {}\n\n    ngOnInit() {\n        this.bindToLinkChange();\n    }\n\n    public toggleOptionsPanel() {\n        this.store.dispatch(new ToggleOptionsPanel());\n    }\n\n    public saveChanges() {\n        if (this.store.selectSnapshot(ShareLinkState.link)) {\n            this.store.dispatch(new UpdateShareableLink(this.getPayload()));\n        } else {\n            this.store.dispatch(new CreateShareableLink(this.getPayload()));\n        }\n    }\n\n    private getPayload() {\n        const payload = {\n            allowEdit: this.form.get('allowEdit').value,\n            allowDownload: this.form.get('allowDownload').value,\n        } as ShareableLinkOptions;\n\n        if (this.expirationVisible.value) {\n            payload.expiresAt = this.form.get('expiresAt.date').value;\n            if (this.form.get('expiresAt.time').value) {\n                payload.expiresAt += ' ' + this.form.get('expiresAt.time').value;\n            }\n        }\n\n        // not sending \"password\" with request will remove it from link\n        if (this.passwordVisible.value) {\n            payload.password = this.form.get('password').value;\n        }\n\n        return payload;\n    }\n\n    private bindToLinkChange() {\n        this.link$.pipe(filter(link => !!link))\n            .subscribe(link => {\n                this.hydrateExpirationForm(link);\n\n                // show or hide password form field\n                this.passwordVisible.setValue(!!link.password);\n                this.expirationVisible.setValue(!!link.expires_at);\n\n                this.form.patchValue({\n                    allowEdit: link.allow_edit,\n                    allowDownload: link.allow_download\n                });\n            });\n    }\n\n    private hydrateExpirationForm(link: ShareableLink) {\n        if ( ! link || ! link.expires_at) return;\n\n        const parts = link.expires_at.split(/[ T]/);\n\n        this.form.get('expiresAt').setValue({\n            date: parts[0],\n            time: parts[1] ? parts[1].substr(0, 5) : '',\n        });\n    }\n\n    public getMinDate(): string {\n        return new Date().toJSON().split('T')[0];\n    }\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Shareable link</h2>\n    <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<mat-dialog-content>\n    <ng-container *ngIf=\"link$ | async\">\n        <div class=\"title\">\n            <div class=\"left\">\n                {{ 'Link sharing is' | trans }}\n                <span class=\"state on\"\n                    ><button class=\"on-text text no-style\" (click)=\"deleteLink()\" trans>\n                        on\n                    </button></span\n                >\n            </div>\n            <div class=\"right\">\n                <button type=\"button\" mat-icon-button (click)=\"deleteLink()\">\n                    <mat-icon svgIcon=\"delete\"></mat-icon>\n                </button>\n                <button type=\"button\" mat-icon-button (click)=\"toggleOptionsPanel()\">\n                    <mat-icon svgIcon=\"settings\"></mat-icon>\n                </button>\n            </div>\n        </div>\n\n        <div class=\"link-container\">\n            <div class=\"link-input-container input-container\">\n                <input\n                    type=\"text\"\n                    id=\"link-input\"\n                    readonly\n                    (click)=\"focusInput()\"\n                    (change)=\"focusInput()\"\n                    [value]=\"shareableLink$ | async\"\n                    tabindex=\"1\"\n                />\n                <button mat-flat-button color=\"accent\" (click)=\"copyLinkToClipboard()\" trans>\n                    Copy\n                </button>\n            </div>\n            <div class=\"social-icons\">\n                <button\n                    type=\"button\"\n                    mat-icon-button\n                    class=\"social-icon no-style facebook\"\n                    (click)=\"shareLink('facebook')\"\n                >\n                    <mat-icon svgIcon=\"facebook\"></mat-icon>\n                </button>\n                <button\n                    type=\"button\"\n                    mat-icon-button\n                    class=\"social-icon no-style twitter\"\n                    (click)=\"shareLink('twitter')\"\n                >\n                    <mat-icon svgIcon=\"twitter\"></mat-icon>\n                </button>\n                <button\n                    type=\"button\"\n                    mat-icon-button\n                    class=\"social-icon no-style mail\"\n                    (click)=\"shareLink('mail')\"\n                >\n                    <mat-icon svgIcon=\"mail\"></mat-icon>\n                </button>\n            </div>\n        </div>\n    </ng-container>\n\n    <link-options [@visibility]=\"optionsVisible$ | async\"></link-options>\n    <loading-indicator\n        [isVisible]=\"loading$ | async\"\n        class=\"overlay-transparent\"\n    ></loading-indicator>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n    <button\n        type=\"button\"\n        mat-button\n        class=\"submit-button\"\n        (click)=\"close()\"\n        [disabled]=\"loading$ | async\"\n        trans\n    >\n        Close\n    </button>\n</mat-dialog-actions>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, OnInit, OnDestroy, AfterViewInit } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Actions, ofActionDispatched, Select, Store } from '@ngxs/store';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport {\n    DeleteShareableLink,\n    LinkCopySuccess,\n    LoadShareableLink, ResetShareLinkState,\n    ShareLinkState,\n    ToggleOptionsPanel\n} from '../links/share-link.state';\nimport { Settings } from '@common/core/config/settings.service';\nimport { ShareableLink } from '../links/models/shareable-link';\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport copy from 'copy-to-clipboard';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { ShareableNetworks, shareLinkSocially } from '@common/core/utils/share-link-socially';\n\n@Component({\n    selector: 'share-link-dialog',\n    templateUrl: './share-link-dialog.component.html',\n    styleUrls: ['./share-link-dialog.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: [\n        trigger('visibility', [\n            state('true', style({\n                height: '*',\n                padding: '*',\n                opacity: '1',\n                overflow: '*',\n            })),\n            state('false', style({\n                height: '0',\n                padding: '0',\n                opacity: '0',\n                overflow: 'hidden',\n            })),\n            transition('true <=> false', animate('225ms cubic-bezier(.4,0,.2,1)'))\n        ]),\n    ],\n})\nexport class ShareLinkDialogComponent implements AfterViewInit, OnInit, OnDestroy {\n    @Select(ShareLinkState.loading) loading$: Observable<boolean>;\n    @Select(ShareLinkState.link) link$: Observable<ShareableLink>;\n    @Select(ShareLinkState.optionsVisible) optionsVisible$: Observable<boolean>;\n    public shareableLink$ = new BehaviorSubject(null);\n    private subscriptions: Subscription[] = [];\n\n    constructor(\n        protected store: Store,\n        protected toast: Toast,\n        protected actions$: Actions,\n        protected settings: Settings,\n        protected dialogRef: MatDialogRef<ShareLinkDialogComponent>,\n    ) {}\n\n    ngOnInit() {\n        this.store.dispatch(new LoadShareableLink());\n        this.bindToOptionsPanelToggle();\n    }\n\n    ngAfterViewInit() {\n        this.bindToLinkChange();\n    }\n\n    ngOnDestroy() {\n        this.store.dispatch(new ResetShareLinkState());\n        this.subscriptions.forEach(s => s.unsubscribe());\n    }\n\n    public toggleOptionsPanel() {\n        this.store.dispatch(new ToggleOptionsPanel());\n    }\n\n    public deleteLink() {\n        this.store.dispatch(new DeleteShareableLink()).subscribe(() => {\n            this.toast.open('Link deleted.');\n            this.dialogRef.close();\n        });\n    }\n\n    public copyLinkToClipboard() {\n        this.focusInput();\n        const success = copy(this.shareableLink$.value);\n\n        if (success) {\n            this.store.dispatch(new LinkCopySuccess());\n        }\n    }\n\n    private bindToLinkChange() {\n        this.link$.subscribe(link => {\n            if ( ! link) return;\n            this.shareableLink$.next(this.settings.getBaseUrl() + '/drive/s/' + link.hash);\n            setTimeout(() => this.focusInput());\n        });\n    }\n\n    private bindToOptionsPanelToggle() {\n        const sub = this.actions$.pipe(ofActionDispatched(ToggleOptionsPanel))\n            .subscribe(() => {\n                // close dialog if user canceled link creation\n                if ( ! this.store.selectSnapshot(ShareLinkState.optionsVisible) && ! this.shareableLink$.value) {\n                    this.close();\n                }\n            });\n        this.subscriptions.push(sub);\n    }\n\n    public shareLink(network: ShareableNetworks) {\n        shareLinkSocially(network, this.shareableLink$.value);\n    }\n\n    public focusInput() {\n        const input = document.getElementById('link-input') as HTMLInputElement;\n        input.focus();\n        input.select();\n    }\n\n    public close() {\n        this.dialogRef.close();\n    }\n}\n","export type ShareableNetworks = 'facebook'|'twitter'|'pinterest'|'tumblr'|'blogger'|'mail';\n\nexport function shareLinkSocially(network: ShareableNetworks, link: string, name?: string, image?: string) {\n    const url = generateShareUrl(network, link, name, image);\n\n    if (network === 'mail') {\n        window.location.href = url;\n    } else {\n        openNewWindow(url);\n    }\n}\n\nfunction openNewWindow(url: string) {\n    const width  = 575,\n        height = 400,\n        left   = (window.innerWidth  - width)  / 2,\n        top    = (window.innerHeight - height) / 2,\n        opts   = 'status=1, scrollbars=1' + ',width=' + width + ',height=' + height + ',top=' + top + ',left=' + left;\n\n    window.open(url, 'share', opts);\n}\n\nfunction generateShareUrl(type: string, link: string, name?: string, image?: string) {\n    switch (type) {\n        case 'facebook':\n            return 'https://www.facebook.com/sharer/sharer.php?u=' + link ;\n        case 'twitter':\n            return `https://twitter.com/intent/tweet?text=${name}&url=${link}`;\n        case 'google-plus':\n            return 'https://plus.google.com/share?url=' + link ;\n        case 'pinterest':\n            return 'https://pinterest.com/pin/create/button/?url=' + link + '&media=' + image;\n        case 'tumblr':\n            const base = 'https://www.tumblr.com/widgets/share/tool?shareSource=legacy&canonicalUrl=&posttype=photo&title=&caption=';\n            return base + name + '&content=' + image + '&url=' + link ;\n        case 'blogger':\n            return 'https://www.blogger.com/blog_this.pyra?t&u=' + link + '&n=' + name;\n        case 'mail':\n            return `mailto:?subject=Check out this link.&body=${link}`;\n    }\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>New Folder</h2>\n    <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form ngNativeValidate (ngSubmit)=\"confirm()\">\n    <mat-dialog-content class=\"many-inputs\">\n        <div class=\"input-container\">\n            <input type=\"text\" [formControl]=\"folderName\" placeholder=\"Folder name...\" trans-placeholder required min=\"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 class=\"cancel-button\" trans>Cancel</button>\n        <button type=\"submit\" mat-raised-button color=\"accent\" class=\"submit-button\" [disabled]=\"loading | async\" trans>Create</button>\n    </mat-dialog-actions>\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { DriveFolder } from '../../models/driveFolder';\nimport { FoldersApiService } from '../../api/folders-api.service';\nimport { Store } from '@ngxs/store';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\nimport { DriveState } from '../../../state/drive-state';\nimport { finalize } from 'rxjs/operators';\nimport { NewFolderCreated } from '../../../state/actions/events';\n\nexport interface CrupdateFolderDialogData {\n    folder?: DriveFolder;\n}\n\nexport interface CrupdateFolderErrors {\n    name?: string;\n}\n\n@Component({\n    selector: 'crupdate-folder-dialog',\n    templateUrl: './crupdate-folder-dialog.component.html',\n    styleUrls: ['./crupdate-folder-dialog.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CrupdateFolderDialogComponent {\n    public folderName = new FormControl();\n    public loading = new BehaviorSubject(false);\n    public errors: CrupdateFolderErrors = {};\n\n    constructor(\n        private dialogRef: MatDialogRef<CrupdateFolderDialogComponent>,\n        @Inject(MAT_DIALOG_DATA) public data: CrupdateFolderDialogData,\n        private store: Store,\n        private foldersApi: FoldersApiService,\n        private changeDetection: ChangeDetectorRef,\n    ) {}\n\n    public confirm() {\n        this.loading.next(true);\n\n        const activeFolder = this.data.folder || this.store.selectSnapshot(DriveState.activeFolder);\n        const params = {\n            name: this.folderName.value,\n            parentId: activeFolder?.id || null,\n        };\n\n        return this.foldersApi.create(params)\n            .pipe(finalize(() => this.loading.next(false)))\n            .subscribe(response => {\n                this.setErrors();\n                this.store.dispatch(new NewFolderCreated(response.folder));\n                this.close();\n            }, response => this.setErrors(response));\n    }\n\n    public setErrors(response?: BackendErrorResponse<CrupdateFolderErrors>) {\n        this.errors = response ? response.errors : {};\n        this.changeDetection.detectChanges();\n    }\n\n    public close() {\n        this.dialogRef.close();\n    }\n}\n","import { SelectionModel, isDataSource } from '@angular/cdk/collections';\nimport { isObservable, Subject, BehaviorSubject, of } from 'rxjs';\nimport { take, filter, takeUntil } from 'rxjs/operators';\nimport { InjectionToken, Directive, ViewContainerRef, Inject, Optional, TemplateRef, Component, ViewEncapsulation, ChangeDetectionStrategy, IterableDiffers, ChangeDetectorRef, Input, ViewChild, ContentChildren, ElementRef, HostListener, NgModule } from '@angular/core';\nimport { coerceNumberProperty, coerceBooleanProperty } from '@angular/cdk/coercion';\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/** Base tree control. It has basic toggle/expand/collapse operations on a single data node. */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/bidi';\nclass BaseTreeControl {\n    constructor() {\n        /** A selection model with multi-selection to track expansion status. */\n        this.expansionModel = new SelectionModel(true);\n    }\n    /** Toggles one single data node's expanded/collapsed state. */\n    toggle(dataNode) {\n        this.expansionModel.toggle(this._trackByValue(dataNode));\n    }\n    /** Expands one single data node. */\n    expand(dataNode) {\n        this.expansionModel.select(this._trackByValue(dataNode));\n    }\n    /** Collapses one single data node. */\n    collapse(dataNode) {\n        this.expansionModel.deselect(this._trackByValue(dataNode));\n    }\n    /** Whether a given data node is expanded or not. Returns true if the data node is expanded. */\n    isExpanded(dataNode) {\n        return this.expansionModel.isSelected(this._trackByValue(dataNode));\n    }\n    /** Toggles a subtree rooted at `node` recursively. */\n    toggleDescendants(dataNode) {\n        this.expansionModel.isSelected(this._trackByValue(dataNode)) ?\n            this.collapseDescendants(dataNode) :\n            this.expandDescendants(dataNode);\n    }\n    /** Collapse all dataNodes in the tree. */\n    collapseAll() {\n        this.expansionModel.clear();\n    }\n    /** Expands a subtree rooted at given data node recursively. */\n    expandDescendants(dataNode) {\n        let toBeProcessed = [dataNode];\n        toBeProcessed.push(...this.getDescendants(dataNode));\n        this.expansionModel.select(...toBeProcessed.map(value => this._trackByValue(value)));\n    }\n    /** Collapses a subtree rooted at given data node recursively. */\n    collapseDescendants(dataNode) {\n        let toBeProcessed = [dataNode];\n        toBeProcessed.push(...this.getDescendants(dataNode));\n        this.expansionModel.deselect(...toBeProcessed.map(value => this._trackByValue(value)));\n    }\n    _trackByValue(value) {\n        return this.trackBy ? this.trackBy(value) : value;\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/** Flat tree control. Able to expand/collapse a subtree recursively for flattened tree. */\nclass FlatTreeControl extends BaseTreeControl {\n    /** Construct with flat tree data node functions getLevel and isExpandable. */\n    constructor(getLevel, isExpandable, options) {\n        super();\n        this.getLevel = getLevel;\n        this.isExpandable = isExpandable;\n        this.options = options;\n        if (this.options) {\n            this.trackBy = this.options.trackBy;\n        }\n    }\n    /**\n     * Gets a list of the data node's subtree of descendent data nodes.\n     *\n     * To make this working, the `dataNodes` of the TreeControl must be flattened tree nodes\n     * with correct levels.\n     */\n    getDescendants(dataNode) {\n        const startIndex = this.dataNodes.indexOf(dataNode);\n        const results = [];\n        // Goes through flattened tree nodes in the `dataNodes` array, and get all descendants.\n        // The level of descendants of a tree node must be greater than the level of the given\n        // tree node.\n        // If we reach a node whose level is equal to the level of the tree node, we hit a sibling.\n        // If we reach a node whose level is greater than the level of the tree node, we hit a\n        // sibling of an ancestor.\n        for (let i = startIndex + 1; i < this.dataNodes.length && this.getLevel(dataNode) < this.getLevel(this.dataNodes[i]); i++) {\n            results.push(this.dataNodes[i]);\n        }\n        return results;\n    }\n    /**\n     * Expands all data nodes in the tree.\n     *\n     * To make this working, the `dataNodes` variable of the TreeControl must be set to all flattened\n     * data nodes of the tree.\n     */\n    expandAll() {\n        this.expansionModel.select(...this.dataNodes.map(node => this._trackByValue(node)));\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/** Nested tree control. Able to expand/collapse a subtree recursively for NestedNode type. */\nclass NestedTreeControl extends BaseTreeControl {\n    /** Construct with nested tree function getChildren. */\n    constructor(getChildren, options) {\n        super();\n        this.getChildren = getChildren;\n        this.options = options;\n        if (this.options) {\n            this.trackBy = this.options.trackBy;\n        }\n    }\n    /**\n     * Expands all dataNodes in the tree.\n     *\n     * To make this working, the `dataNodes` variable of the TreeControl must be set to all root level\n     * data nodes of the tree.\n     */\n    expandAll() {\n        this.expansionModel.clear();\n        const allNodes = this.dataNodes.reduce((accumulator, dataNode) => [...accumulator, ...this.getDescendants(dataNode), dataNode], []);\n        this.expansionModel.select(...allNodes.map(node => this._trackByValue(node)));\n    }\n    /** Gets a list of descendant dataNodes of a subtree rooted at given data node recursively. */\n    getDescendants(dataNode) {\n        const descendants = [];\n        this._getDescendants(descendants, dataNode);\n        // Remove the node itself\n        return descendants.splice(1);\n    }\n    /** A helper function to get descendants recursively. */\n    _getDescendants(descendants, dataNode) {\n        descendants.push(dataNode);\n        const childrenNodes = this.getChildren(dataNode);\n        if (Array.isArray(childrenNodes)) {\n            childrenNodes.forEach((child) => this._getDescendants(descendants, child));\n        }\n        else if (isObservable(childrenNodes)) {\n            // TypeScript as of version 3.5 doesn't seem to treat `Boolean` like a function that\n            // returns a `boolean` specifically in the context of `filter`, so we manually clarify that.\n            childrenNodes.pipe(take(1), filter(Boolean))\n                .subscribe(children => {\n                for (const child of children) {\n                    this._getDescendants(descendants, child);\n                }\n            });\n        }\n    }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Injection token used to provide a `CdkTreeNode` to its outlet.\n * Used primarily to avoid circular imports.\n * @docs-private\n */\nconst CDK_TREE_NODE_OUTLET_NODE = new InjectionToken('CDK_TREE_NODE_OUTLET_NODE');\n/**\n * Outlet for nested CdkNode. Put `[cdkTreeNodeOutlet]` on a tag to place children dataNodes\n * inside the outlet.\n */\nclass CdkTreeNodeOutlet {\n    constructor(viewContainer, _node) {\n        this.viewContainer = viewContainer;\n        this._node = _node;\n    }\n}\nCdkTreeNodeOutlet.ɵfac = function CdkTreeNodeOutlet_Factory(t) { return new (t || CdkTreeNodeOutlet)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(CDK_TREE_NODE_OUTLET_NODE, 8)); };\nCdkTreeNodeOutlet.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodeOutlet, selectors: [[\"\", \"cdkTreeNodeOutlet\", \"\"]] });\nCdkTreeNodeOutlet.ctorParameters = () => [\n    { type: ViewContainerRef },\n    { type: undefined, decorators: [{ type: Inject, args: [CDK_TREE_NODE_OUTLET_NODE,] }, { type: Optional }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodeOutlet, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkTreeNodeOutlet]'\n            }]\n    }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [CDK_TREE_NODE_OUTLET_NODE]\n            }, {\n                type: Optional\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/** Context provided to the tree node component. */\nclass CdkTreeNodeOutletContext {\n    constructor(data) {\n        this.$implicit = data;\n    }\n}\n/**\n * Data node definition for the CdkTree.\n * Captures the node's template and a when predicate that describes when this node should be used.\n */\nclass CdkTreeNodeDef {\n    /** @docs-private */\n    constructor(template) {\n        this.template = template;\n    }\n}\nCdkTreeNodeDef.ɵfac = function CdkTreeNodeDef_Factory(t) { return new (t || CdkTreeNodeDef)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.TemplateRef)); };\nCdkTreeNodeDef.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodeDef, selectors: [[\"\", \"cdkTreeNodeDef\", \"\"]], inputs: { when: [\"cdkTreeNodeDefWhen\", \"when\"] } });\nCdkTreeNodeDef.ctorParameters = () => [\n    { type: TemplateRef }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodeDef, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkTreeNodeDef]',\n                inputs: [\n                    'when: cdkTreeNodeDefWhen'\n                ]\n            }]\n    }], function () { return [{ type: ɵngcc0.TemplateRef }]; }, 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 * Returns an error to be thrown when there is no usable data.\n * @docs-private\n */\nfunction getTreeNoValidDataSourceError() {\n    return Error(`A valid data source must be provided.`);\n}\n/**\n * Returns an error to be thrown when there are multiple nodes that are missing a when function.\n * @docs-private\n */\nfunction getTreeMultipleDefaultNodeDefsError() {\n    return Error(`There can only be one default row without a when predicate function.`);\n}\n/**\n * Returns an error to be thrown when there are no matching node defs for a particular set of data.\n * @docs-private\n */\nfunction getTreeMissingMatchingNodeDefError() {\n    return Error(`Could not find a matching node definition for the provided node data.`);\n}\n/**\n * Returns an error to be thrown when there are tree control.\n * @docs-private\n */\nfunction getTreeControlMissingError() {\n    return Error(`Could not find a tree control for the tree.`);\n}\n/**\n * Returns an error to be thrown when tree control did not implement functions for flat/nested node.\n * @docs-private\n */\nfunction getTreeControlFunctionsMissingError() {\n    return Error(`Could not find functions for nested/flat tree in tree control.`);\n}\n\n/**\n * CDK tree component that connects with a data source to retrieve data of type `T` and renders\n * dataNodes with hierarchy. Updates the dataNodes when new data is provided by the data source.\n */\nclass CdkTree {\n    constructor(_differs, _changeDetectorRef) {\n        this._differs = _differs;\n        this._changeDetectorRef = _changeDetectorRef;\n        /** Subject that emits when the component has been destroyed. */\n        this._onDestroy = new Subject();\n        /** Level of nodes */\n        this._levels = new Map();\n        // TODO(tinayuangao): Setup a listener for scrolling, emit the calculated view to viewChange.\n        //     Remove the MAX_VALUE in viewChange\n        /**\n         * Stream containing the latest information on what rows are being displayed on screen.\n         * Can be used by the data source to as a heuristic of what data should be provided.\n         */\n        this.viewChange = new BehaviorSubject({ start: 0, end: Number.MAX_VALUE });\n    }\n    /**\n     * Provides a stream containing the latest data array to render. Influenced by the tree's\n     * stream of view window (what dataNodes are currently on screen).\n     * Data source can be an observable of data array, or a data array to render.\n     */\n    get dataSource() { return this._dataSource; }\n    set dataSource(dataSource) {\n        if (this._dataSource !== dataSource) {\n            this._switchDataSource(dataSource);\n        }\n    }\n    ngOnInit() {\n        this._dataDiffer = this._differs.find([]).create(this.trackBy);\n        if (!this.treeControl && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getTreeControlMissingError();\n        }\n    }\n    ngOnDestroy() {\n        this._nodeOutlet.viewContainer.clear();\n        this.viewChange.complete();\n        this._onDestroy.next();\n        this._onDestroy.complete();\n        if (this._dataSource && typeof this._dataSource.disconnect === 'function') {\n            this.dataSource.disconnect(this);\n        }\n        if (this._dataSubscription) {\n            this._dataSubscription.unsubscribe();\n            this._dataSubscription = null;\n        }\n    }\n    ngAfterContentChecked() {\n        const defaultNodeDefs = this._nodeDefs.filter(def => !def.when);\n        if (defaultNodeDefs.length > 1 && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getTreeMultipleDefaultNodeDefsError();\n        }\n        this._defaultNodeDef = defaultNodeDefs[0];\n        if (this.dataSource && this._nodeDefs && !this._dataSubscription) {\n            this._observeRenderChanges();\n        }\n    }\n    // TODO(tinayuangao): Work on keyboard traversal and actions, make sure it's working for RTL\n    //     and nested trees.\n    /**\n     * Switch to the provided data source by resetting the data and unsubscribing from the current\n     * render change subscription if one exists. If the data source is null, interpret this by\n     * clearing the node outlet. Otherwise start listening for new data.\n     */\n    _switchDataSource(dataSource) {\n        if (this._dataSource && typeof this._dataSource.disconnect === 'function') {\n            this.dataSource.disconnect(this);\n        }\n        if (this._dataSubscription) {\n            this._dataSubscription.unsubscribe();\n            this._dataSubscription = null;\n        }\n        // Remove the all dataNodes if there is now no data source\n        if (!dataSource) {\n            this._nodeOutlet.viewContainer.clear();\n        }\n        this._dataSource = dataSource;\n        if (this._nodeDefs) {\n            this._observeRenderChanges();\n        }\n    }\n    /** Set up a subscription for the data provided by the data source. */\n    _observeRenderChanges() {\n        let dataStream;\n        if (isDataSource(this._dataSource)) {\n            dataStream = this._dataSource.connect(this);\n        }\n        else if (isObservable(this._dataSource)) {\n            dataStream = this._dataSource;\n        }\n        else if (Array.isArray(this._dataSource)) {\n            dataStream = of(this._dataSource);\n        }\n        if (dataStream) {\n            this._dataSubscription = dataStream.pipe(takeUntil(this._onDestroy))\n                .subscribe(data => this.renderNodeChanges(data));\n        }\n        else if (typeof ngDevMode === 'undefined' || ngDevMode) {\n            throw getTreeNoValidDataSourceError();\n        }\n    }\n    /** Check for changes made in the data and render each change (node added/removed/moved). */\n    renderNodeChanges(data, dataDiffer = this._dataDiffer, viewContainer = this._nodeOutlet.viewContainer, parentData) {\n        const changes = dataDiffer.diff(data);\n        if (!changes) {\n            return;\n        }\n        changes.forEachOperation((item, adjustedPreviousIndex, currentIndex) => {\n            if (item.previousIndex == null) {\n                this.insertNode(data[currentIndex], currentIndex, viewContainer, parentData);\n            }\n            else if (currentIndex == null) {\n                viewContainer.remove(adjustedPreviousIndex);\n                this._levels.delete(item.item);\n            }\n            else {\n                const view = viewContainer.get(adjustedPreviousIndex);\n                viewContainer.move(view, currentIndex);\n            }\n        });\n        this._changeDetectorRef.detectChanges();\n    }\n    /**\n     * Finds the matching node definition that should be used for this node data. If there is only\n     * one node definition, it is returned. Otherwise, find the node definition that has a when\n     * predicate that returns true with the data. If none return true, return the default node\n     * definition.\n     */\n    _getNodeDef(data, i) {\n        if (this._nodeDefs.length === 1) {\n            return this._nodeDefs.first;\n        }\n        const nodeDef = this._nodeDefs.find(def => def.when && def.when(i, data)) || this._defaultNodeDef;\n        if (!nodeDef && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getTreeMissingMatchingNodeDefError();\n        }\n        return nodeDef;\n    }\n    /**\n     * Create the embedded view for the data node template and place it in the correct index location\n     * within the data node view container.\n     */\n    insertNode(nodeData, index, viewContainer, parentData) {\n        const node = this._getNodeDef(nodeData, index);\n        // Node context that will be provided to created embedded view\n        const context = new CdkTreeNodeOutletContext(nodeData);\n        // If the tree is flat tree, then use the `getLevel` function in flat tree control\n        // Otherwise, use the level of parent node.\n        if (this.treeControl.getLevel) {\n            context.level = this.treeControl.getLevel(nodeData);\n        }\n        else if (typeof parentData !== 'undefined' && this._levels.has(parentData)) {\n            context.level = this._levels.get(parentData) + 1;\n        }\n        else {\n            context.level = 0;\n        }\n        this._levels.set(nodeData, context.level);\n        // Use default tree nodeOutlet, or nested node's nodeOutlet\n        const container = viewContainer ? viewContainer : this._nodeOutlet.viewContainer;\n        container.createEmbeddedView(node.template, context, index);\n        // Set the data to just created `CdkTreeNode`.\n        // The `CdkTreeNode` created from `createEmbeddedView` will be saved in static variable\n        //     `mostRecentTreeNode`. We get it from static variable and pass the node data to it.\n        if (CdkTreeNode.mostRecentTreeNode) {\n            CdkTreeNode.mostRecentTreeNode.data = nodeData;\n        }\n    }\n}\nCdkTree.ɵfac = function CdkTree_Factory(t) { return new (t || CdkTree)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\nCdkTree.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: CdkTree, selectors: [[\"cdk-tree\"]], contentQueries: function CdkTree_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, CdkTreeNodeDef, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._nodeDefs = _t);\n    } }, viewQuery: function CdkTree_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(CdkTreeNodeOutlet, 7);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._nodeOutlet = _t.first);\n    } }, hostAttrs: [\"role\", \"tree\", 1, \"cdk-tree\"], inputs: { dataSource: \"dataSource\", treeControl: \"treeControl\", trackBy: \"trackBy\" }, exportAs: [\"cdkTree\"], decls: 1, vars: 0, consts: [[\"cdkTreeNodeOutlet\", \"\"]], template: function CdkTree_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵelementContainer(0, 0);\n    } }, directives: [CdkTreeNodeOutlet], encapsulation: 2 });\nCdkTree.ctorParameters = () => [\n    { type: IterableDiffers },\n    { type: ChangeDetectorRef }\n];\nCdkTree.propDecorators = {\n    dataSource: [{ type: Input }],\n    treeControl: [{ type: Input }],\n    trackBy: [{ type: Input }],\n    _nodeOutlet: [{ type: ViewChild, args: [CdkTreeNodeOutlet, { static: true },] }],\n    _nodeDefs: [{ type: ContentChildren, args: [CdkTreeNodeDef, {\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(CdkTree, [{\n        type: Component,\n        args: [{\n                selector: 'cdk-tree',\n                exportAs: 'cdkTree',\n                template: `<ng-container cdkTreeNodeOutlet></ng-container>`,\n                host: {\n                    'class': 'cdk-tree',\n                    'role': 'tree'\n                },\n                encapsulation: ViewEncapsulation.None,\n                // The \"OnPush\" status for the `CdkTree` component is effectively a noop, so we are removing it.\n                // The view for `CdkTree` consists entirely of templates declared in other views. As they are\n                // declared elsewhere, they are checked when their declaration points are checked.\n                // tslint:disable-next-line:validate-decorators\n                changeDetection: ChangeDetectionStrategy.Default\n            }]\n    }], function () { return [{ type: ɵngcc0.IterableDiffers }, { type: ɵngcc0.ChangeDetectorRef }]; }, { dataSource: [{\n            type: Input\n        }], treeControl: [{\n            type: Input\n        }], trackBy: [{\n            type: Input\n        }], _nodeOutlet: [{\n            type: ViewChild,\n            args: [CdkTreeNodeOutlet, { static: true }]\n        }], _nodeDefs: [{\n            type: ContentChildren,\n            args: [CdkTreeNodeDef, {\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 * Tree node for CdkTree. It contains the data in the tree node.\n */\nclass CdkTreeNode {\n    constructor(_elementRef, _tree) {\n        this._elementRef = _elementRef;\n        this._tree = _tree;\n        /** Subject that emits when the component has been destroyed. */\n        this._destroyed = new Subject();\n        /** Emits when the node's data has changed. */\n        this._dataChanges = new Subject();\n        CdkTreeNode.mostRecentTreeNode = this;\n        // The classes are directly added here instead of in the host property because classes on\n        // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n        // it is not set by the time it's children nodes try to read the class from it.\n        // TODO: move to host after View Engine deprecation\n        this._elementRef.nativeElement.classList.add('cdk-tree-node');\n        this.role = 'treeitem';\n    }\n    /**\n     * The role of the tree node.\n     * @deprecated The correct role is 'treeitem', 'group' should not be used. This input will be\n     *   removed in a future version.\n     * @breaking-change 12.0.0 Remove this input\n     */\n    get role() { return 'treeitem'; }\n    set role(_role) {\n        // TODO: move to host after View Engine deprecation\n        this._elementRef.nativeElement.setAttribute('role', _role);\n    }\n    /** The tree node's data. */\n    get data() { return this._data; }\n    set data(value) {\n        if (value !== this._data) {\n            this._data = value;\n            this._setRoleFromData();\n            this._dataChanges.next();\n        }\n    }\n    get isExpanded() {\n        return this._tree.treeControl.isExpanded(this._data);\n    }\n    _setExpanded(_expanded) {\n        this._isAriaExpanded = _expanded;\n        this._elementRef.nativeElement.setAttribute('aria-expanded', `${_expanded}`);\n    }\n    get level() {\n        // If the treeControl has a getLevel method, use it to get the level. Otherwise read the\n        // aria-level off the parent node and use it as the level for this node (note aria-level is\n        // 1-indexed, while this property is 0-indexed, so we don't need to increment).\n        return this._tree.treeControl.getLevel ?\n            this._tree.treeControl.getLevel(this._data) : this._parentNodeAriaLevel;\n    }\n    ngOnInit() {\n        this._parentNodeAriaLevel = getParentNodeAriaLevel(this._elementRef.nativeElement);\n        this._elementRef.nativeElement.setAttribute('aria-level', `${this.level + 1}`);\n    }\n    ngDoCheck() {\n        // aria-expanded is be set here because the expanded state is stored in the tree control and\n        // the node isn't aware when the state is changed.\n        // It is not set using a @HostBinding because they sometimes get lost with Mixin based classes.\n        // TODO: move to host after View Engine deprecation\n        if (this.isExpanded != this._isAriaExpanded) {\n            this._setExpanded(this.isExpanded);\n        }\n    }\n    ngOnDestroy() {\n        // If this is the last tree node being destroyed,\n        // clear out the reference to avoid leaking memory.\n        if (CdkTreeNode.mostRecentTreeNode === this) {\n            CdkTreeNode.mostRecentTreeNode = null;\n        }\n        this._dataChanges.complete();\n        this._destroyed.next();\n        this._destroyed.complete();\n    }\n    /** Focuses the menu item. Implements for FocusableOption. */\n    focus() {\n        this._elementRef.nativeElement.focus();\n    }\n    // TODO: role should eventually just be set in the component host\n    _setRoleFromData() {\n        if (!this._tree.treeControl.isExpandable && !this._tree.treeControl.getChildren &&\n            (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getTreeControlFunctionsMissingError();\n        }\n        this.role = 'treeitem';\n    }\n}\nCdkTreeNode.ɵfac = function CdkTreeNode_Factory(t) { return new (t || CdkTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(CdkTree)); };\nCdkTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNode, selectors: [[\"cdk-tree-node\"]], inputs: { role: \"role\" }, exportAs: [\"cdkTreeNode\"] });\n/**\n * The most recently created `CdkTreeNode`. We save it in static variable so we can retrieve it\n * in `CdkTree` and set the data to it.\n */\nCdkTreeNode.mostRecentTreeNode = null;\nCdkTreeNode.ctorParameters = () => [\n    { type: ElementRef },\n    { type: CdkTree }\n];\nCdkTreeNode.propDecorators = {\n    role: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNode, [{\n        type: Directive,\n        args: [{\n                selector: 'cdk-tree-node',\n                exportAs: 'cdkTreeNode'\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: CdkTree }]; }, { role: [{\n            type: Input\n        }] }); })();\nfunction getParentNodeAriaLevel(nodeElement) {\n    let parent = nodeElement.parentElement;\n    while (parent && !isNodeElement(parent)) {\n        parent = parent.parentElement;\n    }\n    if (!parent) {\n        if (typeof ngDevMode === 'undefined' || ngDevMode) {\n            throw Error('Incorrect tree structure containing detached node.');\n        }\n        else {\n            return -1;\n        }\n    }\n    else if (parent.classList.contains('cdk-nested-tree-node')) {\n        return coerceNumberProperty(parent.getAttribute('aria-level'));\n    }\n    else {\n        // The ancestor element is the cdk-tree itself\n        return 0;\n    }\n}\nfunction isNodeElement(element) {\n    const classList = element.classList;\n    return !!((classList === null || classList === void 0 ? void 0 : classList.contains('cdk-nested-tree-node')) || (classList === null || classList === void 0 ? void 0 : classList.contains('cdk-tree')));\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 * Nested node is a child of `<cdk-tree>`. It works with nested tree.\n * By using `cdk-nested-tree-node` component in tree node template, children of the parent node will\n * be added in the `cdkTreeNodeOutlet` in tree node template.\n * The children of node will be automatically added to `cdkTreeNodeOutlet`.\n */\nclass CdkNestedTreeNode extends CdkTreeNode {\n    constructor(_elementRef, _tree, _differs) {\n        super(_elementRef, _tree);\n        this._elementRef = _elementRef;\n        this._tree = _tree;\n        this._differs = _differs;\n        // The classes are directly added here instead of in the host property because classes on\n        // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n        // it is not set by the time it's children nodes try to read the class from it.\n        // TODO: move to host after View Engine deprecation\n        this._elementRef.nativeElement.classList.add('cdk-nested-tree-node');\n    }\n    ngAfterContentInit() {\n        this._dataDiffer = this._differs.find([]).create(this._tree.trackBy);\n        if (!this._tree.treeControl.getChildren && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n            throw getTreeControlFunctionsMissingError();\n        }\n        const childrenNodes = this._tree.treeControl.getChildren(this.data);\n        if (Array.isArray(childrenNodes)) {\n            this.updateChildrenNodes(childrenNodes);\n        }\n        else if (isObservable(childrenNodes)) {\n            childrenNodes.pipe(takeUntil(this._destroyed))\n                .subscribe(result => this.updateChildrenNodes(result));\n        }\n        this.nodeOutlet.changes.pipe(takeUntil(this._destroyed))\n            .subscribe(() => this.updateChildrenNodes());\n    }\n    // This is a workaround for https://github.com/angular/angular/issues/23091\n    // In aot mode, the lifecycle hooks from parent class are not called.\n    ngOnInit() {\n        super.ngOnInit();\n    }\n    ngDoCheck() {\n        super.ngDoCheck();\n    }\n    ngOnDestroy() {\n        this._clear();\n        super.ngOnDestroy();\n    }\n    /** Add children dataNodes to the NodeOutlet */\n    updateChildrenNodes(children) {\n        const outlet = this._getNodeOutlet();\n        if (children) {\n            this._children = children;\n        }\n        if (outlet && this._children) {\n            const viewContainer = outlet.viewContainer;\n            this._tree.renderNodeChanges(this._children, this._dataDiffer, viewContainer, this._data);\n        }\n        else {\n            // Reset the data differ if there's no children nodes displayed\n            this._dataDiffer.diff([]);\n        }\n    }\n    /** Clear the children dataNodes. */\n    _clear() {\n        const outlet = this._getNodeOutlet();\n        if (outlet) {\n            outlet.viewContainer.clear();\n            this._dataDiffer.diff([]);\n        }\n    }\n    /** Gets the outlet for the current node. */\n    _getNodeOutlet() {\n        const outlets = this.nodeOutlet;\n        // Note that since we use `descendants: true` on the query, we have to ensure\n        // that we don't pick up the outlet of a child node by accident.\n        return outlets && outlets.find(outlet => !outlet._node || outlet._node === this);\n    }\n}\nCdkNestedTreeNode.ɵfac = function CdkNestedTreeNode_Factory(t) { return new (t || CdkNestedTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(CdkTree), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers)); };\nCdkNestedTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkNestedTreeNode, selectors: [[\"cdk-nested-tree-node\"]], contentQueries: function CdkNestedTreeNode_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, CdkTreeNodeOutlet, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.nodeOutlet = _t);\n    } }, inputs: { role: \"role\", disabled: \"disabled\", tabIndex: \"tabIndex\" }, exportAs: [\"cdkNestedTreeNode\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            { provide: CdkTreeNode, useExisting: CdkNestedTreeNode },\n            { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: CdkNestedTreeNode }\n        ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nCdkNestedTreeNode.ctorParameters = () => [\n    { type: ElementRef },\n    { type: CdkTree },\n    { type: IterableDiffers }\n];\nCdkNestedTreeNode.propDecorators = {\n    nodeOutlet: [{ type: ContentChildren, args: [CdkTreeNodeOutlet, {\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(CdkNestedTreeNode, [{\n        type: Directive,\n        args: [{\n                selector: 'cdk-nested-tree-node',\n                exportAs: 'cdkNestedTreeNode',\n                inputs: ['role', 'disabled', 'tabIndex'],\n                providers: [\n                    { provide: CdkTreeNode, useExisting: CdkNestedTreeNode },\n                    { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: CdkNestedTreeNode }\n                ]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: CdkTree }, { type: ɵngcc0.IterableDiffers }]; }, { nodeOutlet: [{\n            type: ContentChildren,\n            args: [CdkTreeNodeOutlet, {\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/** Regex used to split a string on its CSS units. */\nconst cssUnitPattern = /([A-Za-z%]+)$/;\n/**\n * Indent for the children tree dataNodes.\n * This directive will add left-padding to the node to show hierarchy.\n */\nclass CdkTreeNodePadding {\n    constructor(_treeNode, _tree, _element, _dir) {\n        this._treeNode = _treeNode;\n        this._tree = _tree;\n        this._element = _element;\n        this._dir = _dir;\n        /** Subject that emits when the component has been destroyed. */\n        this._destroyed = new Subject();\n        /** CSS units used for the indentation value. */\n        this.indentUnits = 'px';\n        this._indent = 40;\n        this._setPadding();\n        if (_dir) {\n            _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => this._setPadding(true));\n        }\n        // In Ivy the indentation binding might be set before the tree node's data has been added,\n        // which means that we'll miss the first render. We have to subscribe to changes in the\n        // data to ensure that everything is up to date.\n        _treeNode._dataChanges.subscribe(() => this._setPadding());\n    }\n    /** The level of depth of the tree node. The padding will be `level * indent` pixels. */\n    get level() { return this._level; }\n    set level(value) { this._setLevelInput(value); }\n    /**\n     * The indent for each level. Can be a number or a CSS string.\n     * Default number 40px from material design menu sub-menu spec.\n     */\n    get indent() { return this._indent; }\n    set indent(indent) { this._setIndentInput(indent); }\n    ngOnDestroy() {\n        this._destroyed.next();\n        this._destroyed.complete();\n    }\n    /** The padding indent value for the tree node. Returns a string with px numbers if not null. */\n    _paddingIndent() {\n        const nodeLevel = (this._treeNode.data && this._tree.treeControl.getLevel)\n            ? this._tree.treeControl.getLevel(this._treeNode.data)\n            : null;\n        const level = this._level == null ? nodeLevel : this._level;\n        return typeof level === 'number' ? `${level * this._indent}${this.indentUnits}` : null;\n    }\n    _setPadding(forceChange = false) {\n        const padding = this._paddingIndent();\n        if (padding !== this._currentPadding || forceChange) {\n            const element = this._element.nativeElement;\n            const paddingProp = this._dir && this._dir.value === 'rtl' ? 'paddingRight' : 'paddingLeft';\n            const resetProp = paddingProp === 'paddingLeft' ? 'paddingRight' : 'paddingLeft';\n            element.style[paddingProp] = padding || '';\n            element.style[resetProp] = '';\n            this._currentPadding = padding;\n        }\n    }\n    /**\n     * This has been extracted to a util because of TS 4 and VE.\n     * View Engine doesn't support property rename inheritance.\n     * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n     * @docs-private\n     */\n    _setLevelInput(value) {\n        // Set to null as the fallback value so that _setPadding can fall back to the node level if the\n        // consumer set the directive as `cdkTreeNodePadding=\"\"`. We still want to take this value if\n        // they set 0 explicitly.\n        this._level = coerceNumberProperty(value, null);\n        this._setPadding();\n    }\n    /**\n     * This has been extracted to a util because of TS 4 and VE.\n     * View Engine doesn't support property rename inheritance.\n     * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n     * @docs-private\n     */\n    _setIndentInput(indent) {\n        let value = indent;\n        let units = 'px';\n        if (typeof indent === 'string') {\n            const parts = indent.split(cssUnitPattern);\n            value = parts[0];\n            units = parts[1] || units;\n        }\n        this.indentUnits = units;\n        this._indent = coerceNumberProperty(value);\n        this._setPadding();\n    }\n}\nCdkTreeNodePadding.ɵfac = function CdkTreeNodePadding_Factory(t) { return new (t || CdkTreeNodePadding)(ɵngcc0.ɵɵdirectiveInject(CdkTreeNode), ɵngcc0.ɵɵdirectiveInject(CdkTree), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Directionality, 8)); };\nCdkTreeNodePadding.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodePadding, selectors: [[\"\", \"cdkTreeNodePadding\", \"\"]], inputs: { level: [\"cdkTreeNodePadding\", \"level\"], indent: [\"cdkTreeNodePaddingIndent\", \"indent\"] } });\nCdkTreeNodePadding.ctorParameters = () => [\n    { type: CdkTreeNode },\n    { type: CdkTree },\n    { type: ElementRef },\n    { type: Directionality, decorators: [{ type: Optional }] }\n];\nCdkTreeNodePadding.propDecorators = {\n    level: [{ type: Input, args: ['cdkTreeNodePadding',] }],\n    indent: [{ type: Input, args: ['cdkTreeNodePaddingIndent',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodePadding, [{\n        type: Directive,\n        args: [{\n                selector: '[cdkTreeNodePadding]'\n            }]\n    }], function () { return [{ type: CdkTreeNode }, { type: CdkTree }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.Directionality, decorators: [{\n                type: Optional\n            }] }]; }, { level: [{\n            type: Input,\n            args: ['cdkTreeNodePadding']\n        }], indent: [{\n            type: Input,\n            args: ['cdkTreeNodePaddingIndent']\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 * Node toggle to expand/collapse the node.\n */\nclass CdkTreeNodeToggle {\n    constructor(_tree, _treeNode) {\n        this._tree = _tree;\n        this._treeNode = _treeNode;\n        this._recursive = false;\n    }\n    /** Whether expand/collapse the node recursively. */\n    get recursive() { return this._recursive; }\n    set recursive(value) { this._recursive = coerceBooleanProperty(value); }\n    // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n    // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n    // ViewEngine they're overwritten.\n    // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n    // tslint:disable-next-line:no-host-decorator-in-concrete\n    _toggle(event) {\n        this.recursive\n            ? this._tree.treeControl.toggleDescendants(this._treeNode.data)\n            : this._tree.treeControl.toggle(this._treeNode.data);\n        event.stopPropagation();\n    }\n}\nCdkTreeNodeToggle.ɵfac = function CdkTreeNodeToggle_Factory(t) { return new (t || CdkTreeNodeToggle)(ɵngcc0.ɵɵdirectiveInject(CdkTree), ɵngcc0.ɵɵdirectiveInject(CdkTreeNode)); };\nCdkTreeNodeToggle.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: CdkTreeNodeToggle, selectors: [[\"\", \"cdkTreeNodeToggle\", \"\"]], hostBindings: function CdkTreeNodeToggle_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵlistener(\"click\", function CdkTreeNodeToggle_click_HostBindingHandler($event) { return ctx._toggle($event); });\n    } }, inputs: { recursive: [\"cdkTreeNodeToggleRecursive\", \"recursive\"] } });\nCdkTreeNodeToggle.ctorParameters = () => [\n    { type: CdkTree },\n    { type: CdkTreeNode }\n];\nCdkTreeNodeToggle.propDecorators = {\n    recursive: [{ type: Input, args: ['cdkTreeNodeToggleRecursive',] }],\n    _toggle: [{ type: HostListener, args: ['click', ['$event'],] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeNodeToggle, [{\n        type: Directive,\n        args: [{ selector: '[cdkTreeNodeToggle]' }]\n    }], function () { return [{ type: CdkTree }, { type: CdkTreeNode }]; }, { recursive: [{\n            type: Input,\n            args: ['cdkTreeNodeToggleRecursive']\n        }], \n    // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n    // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n    // ViewEngine they're overwritten.\n    // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n    // tslint:disable-next-line:no-host-decorator-in-concrete\n    _toggle: [{\n            type: HostListener,\n            args: ['click', ['$event']]\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 EXPORTED_DECLARATIONS = [\n    CdkNestedTreeNode,\n    CdkTreeNodeDef,\n    CdkTreeNodePadding,\n    CdkTreeNodeToggle,\n    CdkTree,\n    CdkTreeNode,\n    CdkTreeNodeOutlet,\n];\nclass CdkTreeModule {\n}\nCdkTreeModule.ɵfac = function CdkTreeModule_Factory(t) { return new (t || CdkTreeModule)(); };\nCdkTreeModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: CdkTreeModule });\nCdkTreeModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({});\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(CdkTreeModule, [{\n        type: NgModule,\n        args: [{\n                exports: EXPORTED_DECLARATIONS,\n                declarations: EXPORTED_DECLARATIONS\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(CdkTreeModule, { declarations: [CdkNestedTreeNode, CdkTreeNodeDef, CdkTreeNodePadding, CdkTreeNodeToggle, CdkTree, CdkTreeNode, CdkTreeNodeOutlet], exports: [CdkNestedTreeNode, CdkTreeNodeDef, CdkTreeNodePadding, CdkTreeNodeToggle, CdkTree, CdkTreeNode, CdkTreeNodeOutlet] }); })();\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 { BaseTreeControl, CDK_TREE_NODE_OUTLET_NODE, CdkNestedTreeNode, CdkTree, CdkTreeModule, CdkTreeNode, CdkTreeNodeDef, CdkTreeNodeOutlet, CdkTreeNodeOutletContext, CdkTreeNodePadding, CdkTreeNodeToggle, FlatTreeControl, NestedTreeControl, getTreeControlFunctionsMissingError, getTreeControlMissingError, getTreeMissingMatchingNodeDefError, getTreeMultipleDefaultNodeDefsError, getTreeNoValidDataSourceError };\n\n//# sourceMappingURL=tree.js.map","import { CdkTreeNode, CdkTree, CdkTreeNodeDef, CdkNestedTreeNode, CDK_TREE_NODE_OUTLET_NODE, CdkTreeNodePadding, CdkTreeNodeOutlet, CdkTreeNodeToggle, CdkTreeModule } from '@angular/cdk/tree';\nimport { Directive, ElementRef, Attribute, Input, IterableDiffers, ViewContainerRef, Inject, Optional, Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, NgModule } from '@angular/core';\nimport { mixinTabIndex, mixinDisabled, MatCommonModule } from '@angular/material/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { DataSource } from '@angular/cdk/collections';\nimport { BehaviorSubject, merge } from 'rxjs';\nimport { take, map } 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 */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/tree';\nconst _MatTreeNodeMixinBase = mixinTabIndex(mixinDisabled(CdkTreeNode));\n/**\n * Wrapper for the CdkTree node with Material design styles.\n */\nclass MatTreeNode extends _MatTreeNodeMixinBase {\n    constructor(_elementRef, _tree, tabIndex) {\n        super(_elementRef, _tree);\n        this._elementRef = _elementRef;\n        this._tree = _tree;\n        this.tabIndex = Number(tabIndex) || 0;\n        // The classes are directly added here instead of in the host property because classes on\n        // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n        // it is not set by the time it's children nodes try to read the class from it.\n        // TODO: move to host after View Engine deprecation\n        this._elementRef.nativeElement.classList.add('mat-tree-node');\n    }\n    // This is a workaround for https://github.com/angular/angular/issues/23091\n    // In aot mode, the lifecycle hooks from parent class are not called.\n    ngOnInit() {\n        super.ngOnInit();\n    }\n    ngDoCheck() {\n        super.ngDoCheck();\n    }\n    ngOnDestroy() {\n        super.ngOnDestroy();\n    }\n}\nMatTreeNode.ɵfac = function MatTreeNode_Factory(t) { return new (t || MatTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.CdkTree), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNode, selectors: [[\"mat-tree-node\"]], inputs: { role: \"role\", disabled: \"disabled\", tabIndex: \"tabIndex\" }, exportAs: [\"matTreeNode\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNode, useExisting: MatTreeNode }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNode.ctorParameters = () => [\n    { type: ElementRef },\n    { type: CdkTree },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNode, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-tree-node',\n                exportAs: 'matTreeNode',\n                inputs: ['role', 'disabled', 'tabIndex'],\n                providers: [{ provide: CdkTreeNode, useExisting: MatTreeNode }]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.CdkTree }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }]; }, null); })();\n/**\n * Wrapper for the CdkTree node definition with Material design styles.\n * Captures the node's template and a when predicate that describes when this node should be used.\n */\nclass MatTreeNodeDef extends CdkTreeNodeDef {\n}\nMatTreeNodeDef.ɵfac = /*@__PURE__*/ function () { let ɵMatTreeNodeDef_BaseFactory; return function MatTreeNodeDef_Factory(t) { return (ɵMatTreeNodeDef_BaseFactory || (ɵMatTreeNodeDef_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTreeNodeDef)))(t || MatTreeNodeDef); }; }();\nMatTreeNodeDef.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodeDef, selectors: [[\"\", \"matTreeNodeDef\", \"\"]], inputs: { when: [\"matTreeNodeDefWhen\", \"when\"], data: [\"matTreeNode\", \"data\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNodeDef, useExisting: MatTreeNodeDef }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNodeDef.propDecorators = {\n    data: [{ type: Input, args: ['matTreeNode',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodeDef, [{\n        type: Directive,\n        args: [{\n                selector: '[matTreeNodeDef]',\n                inputs: [\n                    'when: matTreeNodeDefWhen'\n                ],\n                providers: [{ provide: CdkTreeNodeDef, useExisting: MatTreeNodeDef }]\n            }]\n    }], null, { data: [{\n            type: Input,\n            args: ['matTreeNode']\n        }] }); })();\n/**\n * Wrapper for the CdkTree nested node with Material design styles.\n */\nclass MatNestedTreeNode extends CdkNestedTreeNode {\n    constructor(_elementRef, _tree, _differs, tabIndex) {\n        super(_elementRef, _tree, _differs);\n        this._elementRef = _elementRef;\n        this._tree = _tree;\n        this._differs = _differs;\n        this._disabled = false;\n        this.tabIndex = Number(tabIndex) || 0;\n        // The classes are directly added here instead of in the host property because classes on\n        // the host property are not inherited with View Engine. It is not set as a @HostBinding because\n        // it is not set by the time it's children nodes try to read the class from it.\n        // TODO: move to host after View Engine deprecation\n        this._elementRef.nativeElement.classList.add('mat-nested-tree-node');\n    }\n    /** Whether the node is disabled. */\n    get disabled() { return this._disabled; }\n    set disabled(value) { this._disabled = coerceBooleanProperty(value); }\n    /** Tabindex for the node. */\n    get tabIndex() { return this.disabled ? -1 : this._tabIndex; }\n    set tabIndex(value) {\n        // If the specified tabIndex value is null or undefined, fall back to the default value.\n        this._tabIndex = value != null ? value : 0;\n    }\n    // This is a workaround for https://github.com/angular/angular/issues/19145\n    // In aot mode, the lifecycle hooks from parent class are not called.\n    // TODO(tinayuangao): Remove when the angular issue #19145 is fixed\n    ngOnInit() {\n        super.ngOnInit();\n    }\n    ngDoCheck() {\n        super.ngDoCheck();\n    }\n    ngAfterContentInit() {\n        super.ngAfterContentInit();\n    }\n    ngOnDestroy() {\n        super.ngOnDestroy();\n    }\n}\nMatNestedTreeNode.ɵfac = function MatNestedTreeNode_Factory(t) { return new (t || MatNestedTreeNode)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.CdkTree), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.IterableDiffers), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatNestedTreeNode.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatNestedTreeNode, selectors: [[\"mat-nested-tree-node\"]], inputs: { role: \"role\", disabled: \"disabled\", tabIndex: \"tabIndex\", node: [\"matNestedTreeNode\", \"node\"] }, exportAs: [\"matNestedTreeNode\"], features: [ɵngcc0.ɵɵProvidersFeature([\n            { provide: CdkNestedTreeNode, useExisting: MatNestedTreeNode },\n            { provide: CdkTreeNode, useExisting: MatNestedTreeNode },\n            { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: MatNestedTreeNode }\n        ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatNestedTreeNode.ctorParameters = () => [\n    { type: ElementRef },\n    { type: CdkTree },\n    { type: IterableDiffers },\n    { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\nMatNestedTreeNode.propDecorators = {\n    node: [{ type: Input, args: ['matNestedTreeNode',] }],\n    disabled: [{ type: Input }],\n    tabIndex: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatNestedTreeNode, [{\n        type: Directive,\n        args: [{\n                selector: 'mat-nested-tree-node',\n                exportAs: 'matNestedTreeNode',\n                inputs: ['role', 'disabled', 'tabIndex'],\n                providers: [\n                    { provide: CdkNestedTreeNode, useExisting: MatNestedTreeNode },\n                    { provide: CdkTreeNode, useExisting: MatNestedTreeNode },\n                    { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: MatNestedTreeNode }\n                ]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.CdkTree }, { type: ɵngcc0.IterableDiffers }, { type: String, decorators: [{\n                type: Attribute,\n                args: ['tabindex']\n            }] }]; }, { tabIndex: [{\n            type: Input\n        }], disabled: [{\n            type: Input\n        }], node: [{\n            type: Input,\n            args: ['matNestedTreeNode']\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 * Wrapper for the CdkTree padding with Material design styles.\n */\nclass MatTreeNodePadding extends CdkTreeNodePadding {\n    /** The level of depth of the tree node. The padding will be `level * indent` pixels. */\n    get level() { return this._level; }\n    set level(value) { this._setLevelInput(value); }\n    /** The indent for each level. Default number 40px from material design menu sub-menu spec. */\n    get indent() { return this._indent; }\n    set indent(indent) { this._setIndentInput(indent); }\n}\nMatTreeNodePadding.ɵfac = /*@__PURE__*/ function () { let ɵMatTreeNodePadding_BaseFactory; return function MatTreeNodePadding_Factory(t) { return (ɵMatTreeNodePadding_BaseFactory || (ɵMatTreeNodePadding_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTreeNodePadding)))(t || MatTreeNodePadding); }; }();\nMatTreeNodePadding.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodePadding, selectors: [[\"\", \"matTreeNodePadding\", \"\"]], inputs: { level: [\"matTreeNodePadding\", \"level\"], indent: [\"matTreeNodePaddingIndent\", \"indent\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNodePadding, useExisting: MatTreeNodePadding }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNodePadding.propDecorators = {\n    level: [{ type: Input, args: ['matTreeNodePadding',] }],\n    indent: [{ type: Input, args: ['matTreeNodePaddingIndent',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodePadding, [{\n        type: Directive,\n        args: [{\n                selector: '[matTreeNodePadding]',\n                providers: [{ provide: CdkTreeNodePadding, useExisting: MatTreeNodePadding }]\n            }]\n    }], null, { level: [{\n            type: Input,\n            args: ['matTreeNodePadding']\n        }], indent: [{\n            type: Input,\n            args: ['matTreeNodePaddingIndent']\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 * Outlet for nested CdkNode. Put `[matTreeNodeOutlet]` on a tag to place children dataNodes\n * inside the outlet.\n */\nclass MatTreeNodeOutlet {\n    constructor(viewContainer, _node) {\n        this.viewContainer = viewContainer;\n        this._node = _node;\n    }\n}\nMatTreeNodeOutlet.ɵfac = function MatTreeNodeOutlet_Factory(t) { return new (t || MatTreeNodeOutlet)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ViewContainerRef), ɵngcc0.ɵɵdirectiveInject(CDK_TREE_NODE_OUTLET_NODE, 8)); };\nMatTreeNodeOutlet.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodeOutlet, selectors: [[\"\", \"matTreeNodeOutlet\", \"\"]], features: [ɵngcc0.ɵɵProvidersFeature([{\n                provide: CdkTreeNodeOutlet,\n                useExisting: MatTreeNodeOutlet\n            }])] });\nMatTreeNodeOutlet.ctorParameters = () => [\n    { type: ViewContainerRef },\n    { type: undefined, decorators: [{ type: Inject, args: [CDK_TREE_NODE_OUTLET_NODE,] }, { type: Optional }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodeOutlet, [{\n        type: Directive,\n        args: [{\n                selector: '[matTreeNodeOutlet]',\n                providers: [{\n                        provide: CdkTreeNodeOutlet,\n                        useExisting: MatTreeNodeOutlet\n                    }]\n            }]\n    }], function () { return [{ type: ɵngcc0.ViewContainerRef }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [CDK_TREE_NODE_OUTLET_NODE]\n            }, {\n                type: Optional\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/**\n * Wrapper for the CdkTable with Material design styles.\n */\nclass MatTree extends CdkTree {\n}\nMatTree.ɵfac = /*@__PURE__*/ function () { let ɵMatTree_BaseFactory; return function MatTree_Factory(t) { return (ɵMatTree_BaseFactory || (ɵMatTree_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTree)))(t || MatTree); }; }();\nMatTree.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatTree, selectors: [[\"mat-tree\"]], viewQuery: function MatTree_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(MatTreeNodeOutlet, 7);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._nodeOutlet = _t.first);\n    } }, hostAttrs: [\"role\", \"tree\", 1, \"mat-tree\", \"cdk-tree\"], exportAs: [\"matTree\"], features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTree, useExisting: MatTree }]), ɵngcc0.ɵɵInheritDefinitionFeature], decls: 1, vars: 0, consts: [[\"matTreeNodeOutlet\", \"\"]], template: function MatTree_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵelementContainer(0, 0);\n    } }, directives: [MatTreeNodeOutlet], styles: [\".mat-tree{display:block}.mat-tree-node{display:flex;align-items:center;flex:1;word-wrap:break-word}.mat-nested-tree-node{border-bottom-width:0}\\n\"], encapsulation: 2 });\nMatTree.propDecorators = {\n    _nodeOutlet: [{ type: ViewChild, args: [MatTreeNodeOutlet, { static: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTree, [{\n        type: Component,\n        args: [{\n                selector: 'mat-tree',\n                exportAs: 'matTree',\n                template: `<ng-container matTreeNodeOutlet></ng-container>`,\n                host: {\n                    // The 'cdk-tree' class needs to be included here because classes set in the host in the\n                    // parent class are not inherited with View Engine. The 'cdk-tree' class in CdkTreeNode has\n                    // to be set in the host because:\n                    // if it is set as a @HostBinding it is not set by the time the tree nodes try to read the\n                    // class from it.\n                    // the ElementRef is not available in the constructor so the class can't be applied directly\n                    // without a breaking constructor change.\n                    'class': 'mat-tree cdk-tree',\n                    'role': 'tree'\n                },\n                encapsulation: ViewEncapsulation.None,\n                // See note on CdkTree for explanation on why this uses the default change detection strategy.\n                // tslint:disable-next-line:validate-decorators\n                changeDetection: ChangeDetectionStrategy.Default,\n                providers: [{ provide: CdkTree, useExisting: MatTree }],\n                styles: [\".mat-tree{display:block}.mat-tree-node{display:flex;align-items:center;flex:1;word-wrap:break-word}.mat-nested-tree-node{border-bottom-width:0}\\n\"]\n            }]\n    }], null, { _nodeOutlet: [{\n            type: ViewChild,\n            args: [MatTreeNodeOutlet, { static: 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/**\n * Wrapper for the CdkTree's toggle with Material design styles.\n */\n// tslint:disable-next-line: coercion-types\nclass MatTreeNodeToggle extends CdkTreeNodeToggle {\n    get recursive() { return this._recursive; }\n    set recursive(value) {\n        // TODO: when we remove support for ViewEngine, change this setter to an input\n        // alias in the decorator metadata.\n        this._recursive = coerceBooleanProperty(value);\n    }\n}\nMatTreeNodeToggle.ɵfac = /*@__PURE__*/ function () { let ɵMatTreeNodeToggle_BaseFactory; return function MatTreeNodeToggle_Factory(t) { return (ɵMatTreeNodeToggle_BaseFactory || (ɵMatTreeNodeToggle_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatTreeNodeToggle)))(t || MatTreeNodeToggle); }; }();\nMatTreeNodeToggle.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatTreeNodeToggle, selectors: [[\"\", \"matTreeNodeToggle\", \"\"]], inputs: { recursive: [\"matTreeNodeToggleRecursive\", \"recursive\"] }, features: [ɵngcc0.ɵɵProvidersFeature([{ provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle }]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatTreeNodeToggle.propDecorators = {\n    recursive: [{ type: Input, args: ['matTreeNodeToggleRecursive',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeNodeToggle, [{\n        type: Directive,\n        args: [{\n                selector: '[matTreeNodeToggle]',\n                providers: [{ provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle }]\n            }]\n    }], null, { recursive: [{\n            type: Input,\n            args: ['matTreeNodeToggleRecursive']\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_TREE_DIRECTIVES = [\n    MatNestedTreeNode,\n    MatTreeNodeDef,\n    MatTreeNodePadding,\n    MatTreeNodeToggle,\n    MatTree,\n    MatTreeNode,\n    MatTreeNodeOutlet\n];\nclass MatTreeModule {\n}\nMatTreeModule.ɵfac = function MatTreeModule_Factory(t) { return new (t || MatTreeModule)(); };\nMatTreeModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatTreeModule });\nMatTreeModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[CdkTreeModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatTreeModule, [{\n        type: NgModule,\n        args: [{\n                imports: [CdkTreeModule, MatCommonModule],\n                exports: [MatCommonModule, MAT_TREE_DIRECTIVES],\n                declarations: MAT_TREE_DIRECTIVES\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatTreeModule, { declarations: function () { return [MatNestedTreeNode, MatTreeNodeDef, MatTreeNodePadding, MatTreeNodeToggle, MatTree, MatTreeNode, MatTreeNodeOutlet]; }, imports: function () { return [CdkTreeModule, MatCommonModule]; }, exports: function () { return [MatCommonModule, MatNestedTreeNode, MatTreeNodeDef, MatTreeNodePadding, MatTreeNodeToggle, MatTree, MatTreeNode, MatTreeNodeOutlet]; } }); })();\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 * Tree flattener to convert a normal type of node to node with children & level information.\n * Transform nested nodes of type `T` to flattened nodes of type `F`.\n *\n * For example, the input data of type `T` is nested, and contains its children data:\n *   SomeNode: {\n *     key: 'Fruits',\n *     children: [\n *       NodeOne: {\n *         key: 'Apple',\n *       },\n *       NodeTwo: {\n *        key: 'Pear',\n *      }\n *    ]\n *  }\n *  After flattener flatten the tree, the structure will become\n *  SomeNode: {\n *    key: 'Fruits',\n *    expandable: true,\n *    level: 1\n *  },\n *  NodeOne: {\n *    key: 'Apple',\n *    expandable: false,\n *    level: 2\n *  },\n *  NodeTwo: {\n *   key: 'Pear',\n *   expandable: false,\n *   level: 2\n * }\n * and the output flattened type is `F` with additional information.\n */\nclass MatTreeFlattener {\n    constructor(transformFunction, getLevel, isExpandable, getChildren) {\n        this.transformFunction = transformFunction;\n        this.getLevel = getLevel;\n        this.isExpandable = isExpandable;\n        this.getChildren = getChildren;\n    }\n    _flattenNode(node, level, resultNodes, parentMap) {\n        const flatNode = this.transformFunction(node, level);\n        resultNodes.push(flatNode);\n        if (this.isExpandable(flatNode)) {\n            const childrenNodes = this.getChildren(node);\n            if (childrenNodes) {\n                if (Array.isArray(childrenNodes)) {\n                    this._flattenChildren(childrenNodes, level, resultNodes, parentMap);\n                }\n                else {\n                    childrenNodes.pipe(take(1)).subscribe(children => {\n                        this._flattenChildren(children, level, resultNodes, parentMap);\n                    });\n                }\n            }\n        }\n        return resultNodes;\n    }\n    _flattenChildren(children, level, resultNodes, parentMap) {\n        children.forEach((child, index) => {\n            let childParentMap = parentMap.slice();\n            childParentMap.push(index != children.length - 1);\n            this._flattenNode(child, level + 1, resultNodes, childParentMap);\n        });\n    }\n    /**\n     * Flatten a list of node type T to flattened version of node F.\n     * Please note that type T may be nested, and the length of `structuredData` may be different\n     * from that of returned list `F[]`.\n     */\n    flattenNodes(structuredData) {\n        let resultNodes = [];\n        structuredData.forEach(node => this._flattenNode(node, 0, resultNodes, []));\n        return resultNodes;\n    }\n    /**\n     * Expand flattened node with current expansion status.\n     * The returned list may have different length.\n     */\n    expandFlattenedNodes(nodes, treeControl) {\n        let results = [];\n        let currentExpand = [];\n        currentExpand[0] = true;\n        nodes.forEach(node => {\n            let expand = true;\n            for (let i = 0; i <= this.getLevel(node); i++) {\n                expand = expand && currentExpand[i];\n            }\n            if (expand) {\n                results.push(node);\n            }\n            if (this.isExpandable(node)) {\n                currentExpand[this.getLevel(node) + 1] = treeControl.isExpanded(node);\n            }\n        });\n        return results;\n    }\n}\n/**\n * Data source for flat tree.\n * The data source need to handle expansion/collapsion of the tree node and change the data feed\n * to `MatTree`.\n * The nested tree nodes of type `T` are flattened through `MatTreeFlattener`, and converted\n * to type `F` for `MatTree` to consume.\n */\nclass MatTreeFlatDataSource extends DataSource {\n    constructor(_treeControl, _treeFlattener, initialData = []) {\n        super();\n        this._treeControl = _treeControl;\n        this._treeFlattener = _treeFlattener;\n        this._flattenedData = new BehaviorSubject([]);\n        this._expandedData = new BehaviorSubject([]);\n        this._data = new BehaviorSubject(initialData);\n    }\n    get data() { return this._data.value; }\n    set data(value) {\n        this._data.next(value);\n        this._flattenedData.next(this._treeFlattener.flattenNodes(this.data));\n        this._treeControl.dataNodes = this._flattenedData.value;\n    }\n    connect(collectionViewer) {\n        const changes = [\n            collectionViewer.viewChange,\n            this._treeControl.expansionModel.changed,\n            this._flattenedData\n        ];\n        return merge(...changes).pipe(map(() => {\n            this._expandedData.next(this._treeFlattener.expandFlattenedNodes(this._flattenedData.value, this._treeControl));\n            return this._expandedData.value;\n        }));\n    }\n    disconnect() {\n        // no op\n    }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Data source for nested tree.\n *\n * The data source for nested tree doesn't have to consider node flattener, or the way to expand\n * or collapse. The expansion/collapsion will be handled by TreeControl and each non-leaf node.\n */\nclass MatTreeNestedDataSource extends DataSource {\n    constructor() {\n        super(...arguments);\n        this._data = new BehaviorSubject([]);\n    }\n    /**\n     * Data for the nested tree\n     */\n    get data() { return this._data.value; }\n    set data(value) { this._data.next(value); }\n    connect(collectionViewer) {\n        return merge(...[collectionViewer.viewChange, this._data])\n            .pipe(map(() => {\n            return this.data;\n        }));\n    }\n    disconnect() {\n        // no op\n    }\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MatNestedTreeNode, MatTree, MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule, MatTreeNestedDataSource, MatTreeNode, MatTreeNodeDef, MatTreeNodeOutlet, MatTreeNodePadding, MatTreeNodeToggle };\n\n//# sourceMappingURL=tree.js.map","import { Injectable } from '@angular/core';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { Observable, of as observableOf } from 'rxjs';\n\n/** Flat node with expandable and level information */\nexport interface FolderFlatNode extends DriveFolder {\n    level: number;\n    expandable: boolean;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class FoldersTreeService {\n    public control: FlatTreeControl<FolderFlatNode>;\n    public flattener: MatTreeFlattener<DriveFolder, FolderFlatNode>;\n    public dataSource: MatTreeFlatDataSource<DriveFolder, FolderFlatNode>;\n    public set data(items: DriveFolder[]) {\n        this.dataSource.data = items;\n    }\n\n    constructor() {\n        this.createTreeFlattener();\n        this.createTreeControl();\n        this.createTreeDataSource();\n    }\n\n    private createTreeFlattener() {\n        this.flattener = new MatTreeFlattener(\n            this.transformer,\n            this.getLevel,\n            this.isExpandable, this.getChildren\n        );\n    }\n\n    private createTreeControl() {\n        this.control = new FlatTreeControl<FolderFlatNode>(\n            this.getLevel,\n            this.isExpandable\n        );\n    }\n\n    private createTreeDataSource() {\n        this.dataSource = new MatTreeFlatDataSource(\n            this.control,\n            this.flattener\n        );\n    }\n\n    public transformer(node: DriveFolder, level: number) {\n        const flatNode = Object.assign({}, node) as FolderFlatNode;\n        flatNode.level = level;\n        flatNode.expandable = !!node.children;\n        return flatNode;\n    }\n\n    private getLevel(node: FolderFlatNode): number {\n        return node.level;\n    }\n\n    private isExpandable(node: FolderFlatNode): boolean {\n        return node.expandable;\n    }\n\n    private getChildren(node: DriveFolder): Observable<DriveFolder[]> {\n        return observableOf(node.children);\n    }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const AVAILABLE_CONTEXT_MENUS = new InjectionToken<any>('AVAILABLE_CONTEXT_MENUS');\n","import {OverlayRef} from '@angular/cdk/overlay';\n\nexport class ContextMenuRef<T> {\n    constructor(private overlayRef: OverlayRef) {}\n\n    public close() {\n        if (this.overlayRef) {\n            this.overlayRef.dispose();\n        }\n    }\n\n    public backdropClick() {\n        return this.overlayRef.backdropClick();\n    }\n\n    public attachments() {\n        return this.overlayRef.attachments();\n    }\n\n    public detachments() {\n        return this.overlayRef.detachments();\n    }\n\n    public backdropElement() {\n        return this.overlayRef.backdropElement;\n    }\n\n    public contextMenuElement() {\n        return this.overlayRef.overlayElement;\n    }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const CONTEXT_MENU_DATA = new InjectionToken<{ [key: string]: any }>('CONTEXT_MENU_DATA');\n","import {ComponentFactoryResolver, ElementRef, Injectable, Injector, NgZone} from '@angular/core';\nimport {NavigationStart, Router} from '@angular/router';\nimport {ComponentPortal, ComponentType, PortalInjector} from '@angular/cdk/portal';\nimport {Overlay, PositionStrategy} from '@angular/cdk/overlay';\nimport {filter} from 'rxjs/operators';\nimport {ContextMenuRef} from './context-menu-ref';\nimport {CONTEXT_MENU_DATA} from './context-menu-data';\n\nexport interface ContextMenuParams {\n    data?: { [key: string]: any };\n    offsetX?: number;\n    offsetY?: number;\n    originX?: 'start' | 'center' | 'end';\n    originY?: 'top' | 'center' | 'bottom';\n    overlayX?: 'start' | 'center' | 'end';\n    overlayY?: 'top' | 'center' | 'bottom';\n}\n\ntype MenuOrigin = MouseEvent | EventTarget | HTMLElement;\n\nconst ORIGIN_ID = 'dynamic-context-menu-origin';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class ContextMenu {\n    private lastOrigin: HTMLElement;\n    private openContextMenu: ContextMenuRef<any>|null;\n\n    constructor(\n        private router: Router,\n        private zone: NgZone,\n        private injector: Injector,\n        private resolver: ComponentFactoryResolver,\n        private overlay: Overlay,\n    ) {\n        this.router.events\n            .pipe(filter(e => e instanceof NavigationStart))\n            .subscribe(() => this.close());\n    }\n\n    public open<T>(component: ComponentType<T>, e: MenuOrigin, params: ContextMenuParams = {}): ContextMenuRef<T> {\n        this.close();\n\n        if ( ! component) {\n            return;\n        }\n\n        const overlayRef = this.createOverlay(e, params);\n        this.openContextMenu = new ContextMenuRef(overlayRef);\n\n        const injector = new PortalInjector(this.injector, new WeakMap<any, any>([\n            [CONTEXT_MENU_DATA, params.data],\n            [ContextMenuRef, this.openContextMenu],\n        ]));\n\n        const portal = new ComponentPortal(component, null, injector);\n\n        overlayRef.attach(portal);\n        this.bindEventsToOverlay();\n\n        return this.openContextMenu;\n    }\n\n    /**\n     * Close currently open context menu.\n     */\n    public close() {\n        this.removeLastOrigin();\n\n        if (this.openContextMenu) {\n            this.openContextMenu.close();\n            this.openContextMenu = null;\n        }\n    }\n\n    private createOverlay(e: MenuOrigin, params: ContextMenuParams) {\n        return this.overlay.create({\n            positionStrategy: this.getMenuPositionStrategy(e, params),\n            scrollStrategy: this.overlay.scrollStrategies.close(),\n            hasBackdrop: true,\n            backdropClass: 'context-menu-backdrop',\n            panelClass: 'context-menu-overlay'\n        });\n    }\n\n    private bindEventsToOverlay() {\n        this.openContextMenu.contextMenuElement().addEventListener('click', () => {\n            this.close();\n        });\n\n        this.openContextMenu.backdropClick().subscribe(() => {\n            this.close();\n        });\n\n        this.openContextMenu.backdropElement().addEventListener('contextmenu', e => {\n            e.preventDefault();\n            this.close();\n        });\n\n        this.openContextMenu.detachments().subscribe(() => {\n            this.close();\n        });\n    }\n\n    private getMenuPositionStrategy(e: MenuOrigin, params: ContextMenuParams): PositionStrategy {\n        this.createOriginFromEvent(e, params);\n\n        const primary = {\n            originX: params.originX || 'center',\n            originY: params.originY || 'bottom',\n            overlayX: params.overlayX || 'center',\n            overlayY: params.overlayY || 'top',\n        };\n\n        return this.overlay.position().flexibleConnectedTo(new ElementRef(this.lastOrigin))\n            .withPositions([\n                primary,\n                {originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom'},\n                {originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top'},\n                {originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'bottom'}\n            ]);\n    }\n\n    private createOriginFromEvent(e: MenuOrigin, params: ContextMenuParams) {\n        this.removeLastOrigin();\n\n        if (e instanceof HTMLElement || e instanceof EventTarget) {\n            this.lastOrigin = e as HTMLElement;\n        } else {\n            this.lastOrigin = document.createElement('div');\n            this.lastOrigin.style.position = 'fixed';\n            this.lastOrigin.style.top = e.clientY + (params.offsetY || 0) + 'px';\n            this.lastOrigin.style.left = e.clientX + (params.offsetX || 0) + 'px';\n            this.lastOrigin.id = ORIGIN_ID;\n            document.body.appendChild(this.lastOrigin);\n        }\n    }\n\n    private removeLastOrigin() {\n        if (this.lastOrigin && this.lastOrigin.id === ORIGIN_ID) {\n            this.lastOrigin.remove();\n        }\n    }\n}\n","import {Directive, ElementRef, Inject, Input, OnInit} from '@angular/core';\nimport {ContextMenu} from './context-menu.service';\nimport { AVAILABLE_CONTEXT_MENUS } from './available-context-menus';\n\n@Directive({\n    selector: '[contextMenu]'\n})\nexport class ContextMenuDirective implements OnInit {\n    @Input('contextMenu') params: string|{type: string, [key: string]: any};\n    @Input('disableContextMenu') disableContextMenu = false;\n\n    public availableMenus: object = {};\n\n    constructor(\n        private el: ElementRef,\n        private contextMenu: ContextMenu,\n        @Inject(AVAILABLE_CONTEXT_MENUS) _availableMenus: object[]\n    ) {\n        _availableMenus.forEach(config => {\n            Object.assign(this.availableMenus, config);\n        });\n    }\n\n    ngOnInit() {\n        this.el.nativeElement.addEventListener('contextmenu', e => {\n            e.preventDefault();\n            e.stopPropagation();\n\n            if (this.disableContextMenu) return;\n\n            this.contextMenu.open(\n                this.getMenuComponent(),\n                e,\n                {\n                    overlayX: 'start',\n                    overlayY: 'top',\n                    data: this.getMenuData()\n                }\n            );\n        });\n    }\n\n    private getMenuComponent() {\n        if (typeof this.params === 'string') {\n            return this.availableMenus[this.params];\n        } else {\n            return this.availableMenus[this.params.type];\n        }\n    }\n\n    private getMenuData() {\n        return (typeof this.params === 'string') ? {type: this.params} : this.params;\n    }\n}\n","import { Directive, ElementRef, OnDestroy, OnInit } from '@angular/core';\nimport { Select } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable, fromEvent, Subscription } from 'rxjs';\n\n@Directive()\nexport abstract class BaseDropTarget implements OnInit, OnDestroy {\n    @Select(DriveState.dragging) dragging: Observable<boolean>;\n    protected subs: Subscription[] = [];\n    protected active: boolean;\n    protected abstract el: ElementRef<HTMLElement>;\n\n    ngOnInit() {\n        this.dragging.subscribe(dragging => {\n            if (dragging) {\n                this.onDragStart();\n            } else {\n                this.onDragEnd();\n            }\n        });\n    }\n\n    ngOnDestroy() {\n        this.unsubscribe();\n    }\n\n    protected abstract canDrop();\n    protected abstract executeAction();\n\n    protected onDragStart() {\n        const enter = fromEvent(this.el.nativeElement, 'mouseenter')\n            .subscribe(() => this.onDragEnter());\n\n        const leave = fromEvent(this.el.nativeElement, 'mouseleave')\n            .subscribe(() => this.onDragLeave());\n\n        this.subs.push(enter, leave);\n    }\n\n    protected onDragEnter() {\n        const canDrop = this.canDrop(),\n            classes = ['drag-over'];\n        if (canDrop) {\n            this.active = true;\n            classes.push('can-drop');\n        }\n        this.el.nativeElement.classList.add(...classes);\n    }\n\n    protected onDragLeave() {\n        this.active = false;\n        this.removeDragOverClass();\n    }\n\n    protected onDragEnd() {\n        this.unsubscribe();\n        this.removeDragOverClass();\n\n        // pointer never left element before drag stop,\n        // we can assume that user dropped on this el\n        if (this.active && this.canDrop()) {\n            this.executeAction();\n            this.active = false;\n        }\n    }\n\n    protected unsubscribe() {\n        this.subs.forEach(sub => sub && sub.unsubscribe());\n    }\n\n    protected removeDragOverClass() {\n        this.el.nativeElement.classList.remove(...['drag-over', 'can-drop']);\n    }\n}\n","import { Directive, ElementRef, Input } from '@angular/core';\nimport { BaseDropTarget } from './base-drop-target';\nimport { DriveState} from '../../state/drive-state';\nimport { Store } from '@ngxs/store';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { MoveEntries } from '../../state/actions/commands';\n\n@Directive({\n    selector: '[folderDropTarget]'\n})\nexport class FolderDropTargetDirective extends BaseDropTarget {\n    @Input('folderDropTarget') folder: DriveFolder;\n\n    constructor(\n        protected el: ElementRef,\n        protected store: Store,\n    ) {\n      super();\n    }\n\n    protected canDrop(): boolean {\n        const entries = this.store.selectSnapshot(DriveState.selectedEntries),\n            folder = this.folder as DriveFolder;\n\n        return DriveState.canMoveEntriesTo(entries, folder);\n    }\n\n    protected executeAction() {\n        return this.store.dispatch(new MoveEntries(this.folder));\n    }\n}\n","<div class=\"mat-tree-node root-tree-node\" *ngIf=\"showRootNode\" (click)=\"selectFolder()\" [class.active]=\"!(selectedFolderId$ | async)\">\n    <mat-icon svgIcon=\"network-drive-custom\" class=\"folder-icon\"></mat-icon>\n    <span class=\"text\" trans>My Drive</span>\n</div>\n<mat-tree [dataSource]=\"tree.dataSource\" [treeControl]=\"tree.control\">\n    <mat-tree-node\n            *matTreeNodeDef=\"let node\"\n            matTreeNodePadding\n            [matTreeNodePaddingIndent]=\"showRootNode ? 40 : 24\"\n            [contextMenu]=\"{type: 'entry', entry: node}\"\n            [disableContextMenu]=\"disableContextMenu\"\n            [folderDropTarget]=\"node\"\n            [class.active]=\"(selectedFolderId$ | async) === node.hash\"\n            class=\"tree-node\"\n    >\n        <mat-icon class=\"toggle-expansion-icon\"\n                  matTreeNodeToggle\n                  [class.expanded]=\"tree.control.isExpanded(node)\"\n                  svgIcon=\"arrow-drop-down\"\n        ></mat-icon>\n        <button type=\"button\" class=\"no-style folder-button\" (click)=\"selectFolder(node)\">\n            <mat-icon svgIcon=\"folder\" class=\"folder-icon\"></mat-icon>\n            <span class=\"folder-name text\">{{node.name}}</span>\n        </button>\n    </mat-tree-node>\n</mat-tree>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    EventEmitter,\n    HostBinding,\n    Input,\n    OnDestroy,\n    OnInit,\n    Output,\n    ViewEncapsulation\n} from '@angular/core';\nimport { FoldersTreeService } from './folders-tree.service';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n    selector: 'folders-tree',\n    templateUrl: './folders-tree.component.html',\n    styleUrls: ['./folders-tree.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [FoldersTreeService],\n})\nexport class FoldersTreeComponent implements OnInit, OnDestroy {\n    @HostBinding('class.expanded') @Input() expanded = false;\n    @HostBinding('class.has-root-node') @Input() showRootNode = false;\n    @Input() disableContextMenu = false;\n    @Output() folderSelected: EventEmitter<DriveFolder> = new EventEmitter();\n\n    // TODO: start trackBy function when it's fixed on angular material side\n    private subscriptions: Subscription[] = [];\n    public selectedFolderId$ = new BehaviorSubject<string>(null);\n    constructor(public tree: FoldersTreeService, private store: Store) {}\n\n    public selectFolder(folder?: DriveFolder) {\n        this.selectedFolderId$.next(folder?.hash);\n        this.folderSelected.emit(folder);\n    }\n\n    public toggle() {\n        this.expanded = !this.expanded;\n    }\n\n    ngOnInit() {\n        const sub1 = this.store.select(DriveState.userFolders)\n            .pipe(filter(fs => !!fs))\n            .subscribe(folders => {\n                this.tree.data = folders;\n            });\n\n        const sub2 = this.store.select(DriveState.activePage).subscribe(page => {\n            this.selectedFolderId$.next(page.folderHash);\n        });\n\n        this.subscriptions.push(sub1, sub2);\n    }\n\n    ngOnDestroy() {\n        this.subscriptions.forEach(s => s.unsubscribe());\n    }\n}\n","import {\n    ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewEncapsulation\n} from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Actions, ofAction, Select, Store } from '@ngxs/store';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { DriveState } from '../../state/drive-state';\nimport { map, take } from 'rxjs/operators';\nimport { MoveEntries } from '../../state/actions/commands';\nimport { MoveEntriesFailed, MoveEntriesSuccess } from '../../state/actions/events';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveFolder } from '../../folders/models/driveFolder';\n\n@Component({\n    selector: 'move-entries-dialog',\n    templateUrl: './move-entries-dialog.component.html',\n    styleUrls: ['./move-entries-dialog.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MoveEntriesDialogComponent implements OnInit, OnDestroy {\n    @Select(DriveState.selectedEntries) selectedEntries$: Observable<DriveEntry[]>;\n    public destination$ = new BehaviorSubject<DriveFolder>(this.store.selectSnapshot(DriveState.activePage).folder);\n    public loading$ = new BehaviorSubject<boolean>(false);\n    private subscriptions: Subscription[] = [];\n    public canMove$ = this.destination$.pipe(map(destination => {\n        const movingEntries = this.store.selectSnapshot(DriveState.selectedEntries);\n        return DriveState.canMoveEntriesTo(movingEntries, destination);\n    }));\n\n    constructor(\n        protected dialogRef: MatDialogRef<MoveEntriesDialogComponent>,\n        protected store: Store,\n        protected actions: Actions,\n    ) {}\n\n    ngOnInit() {\n        const failure = this.actions.pipe(ofAction(MoveEntriesFailed)).subscribe(() => {\n            this.loading$.next(false);\n        });\n        const success = this.actions.pipe(ofAction(MoveEntriesSuccess), take(1))\n            .subscribe(() => {\n                this.close();\n            });\n        this.subscriptions.push(...[success, failure]);\n    }\n\n    ngOnDestroy() {\n        this.subscriptions.forEach(s => s.unsubscribe());\n    }\n\n    public confirm() {\n        this.loading$.next(true);\n        this.store.dispatch(new MoveEntries(this.destination$.value))\n            .subscribe(() => {\n                this.loading$.next(false);\n            });\n    }\n\n    public close() {\n        this.dialogRef.close();\n    }\n}\n","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Rename</h2>\n    <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form ngNativeValidate (ngSubmit)=\"confirm()\">\n    <mat-dialog-content class=\"many-inputs\">\n        <div class=\"input-container\">\n            <input type=\"text\" [formControl]=\"entryName\" placeholder=\"Enter a name...\" trans-placeholder required min=\"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 class=\"cancel-button\" trans>Cancel</button>\n        <button type=\"submit\" mat-raised-button color=\"accent\" class=\"submit-button\" [disabled]=\"loading | async\" trans>Rename</button>\n    </mat-dialog-actions>\n</form>","<div class=\"modal-header\">\n    <h2 mat-dialog-title trans>Move items</h2>\n    <button type=\"button\" mat-icon-button (click)=\"close()\" class=\"close-button\" tabindex=\"-1\">\n        <mat-icon svgIcon=\"close\"></mat-icon>\n    </button>\n</div>\n\n<form ngNativeValidate (ngSubmit)=\"confirm()\">\n    <mat-dialog-content>\n        <folders-tree\n            [expanded]=\"true\"\n            [disableContextMenu]=\"true\"\n            [showRootNode]=\"true\"\n            (folderSelected)=\"destination$.next($event)\"\n        ></folders-tree>\n    </mat-dialog-content>\n\n    <mat-dialog-actions>\n        <button (click)=\"close()\" type=\"button\" mat-button class=\"cancel-button\" trans>Cancel</button>\n        <button type=\"submit\" mat-raised-button color=\"accent\" class=\"submit-button\" [disabled]=\"!(canMove$ | async) || (loading$ | async)\" trans>Move</button>\n    </mat-dialog-actions>\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { FormControl } from '@angular/forms';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\nimport { DriveState } from '../../state/drive-state';\nimport { Store } from '@ngxs/store';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { finalize } from 'rxjs/operators';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { DriveEntryApiService } from '../../drive-entry-api.service';\nimport { EntryRenamed } from '../../state/actions/events';\n\nexport interface RenameEntryDialogErrors {\n    name?: string;\n}\n\n@Component({\n    selector: 'rename-entry-dialog',\n    templateUrl: './rename-entry-dialog.component.html',\n    styleUrls: ['./rename-entry-dialog.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class RenameEntryDialogComponent implements OnInit {\n    public entryName = new FormControl();\n    public loading = new BehaviorSubject(false);\n    public errors: RenameEntryDialogErrors = {};\n    public entry: DriveEntry;\n\n    constructor(\n        private dialogRef: MatDialogRef<RenameEntryDialogComponent>,\n        private store: Store,\n        private toast: Toast,\n        private entriesApi: DriveEntryApiService,\n        private changeDetection: ChangeDetectorRef,\n    ) {}\n\n    ngOnInit() {\n        this.entry = this.store.selectSnapshot(DriveState.selectedEntries)[0];\n        this.entryName.setValue(this.entry.name);\n    }\n\n    public confirm() {\n        const newName = this.entryName.value;\n\n        // entry name was not changed\n        if (newName === this.entry.name) {\n            return this.close();\n        }\n\n        this.loading.next(true);\n\n        return this.entriesApi.update(this.entry.id, {name: newName})\n            .pipe(finalize(() => this.loading.next(false)))\n            .subscribe(() => {\n                this.setErrors();\n                this.store.dispatch(new EntryRenamed(this.entry, newName));\n                this.close();\n            }, response => this.setErrors(response));\n    }\n\n    public setErrors(response?: BackendErrorResponse<RenameEntryDialogErrors>) {\n        this.loading.next(false);\n        this.errors = response ? response.errors : {};\n        this.changeDetection.detectChanges();\n    }\n\n    public close() {\n        this.dialogRef.close();\n    }\n}\n","import { Store } from '@ngxs/store';\nimport { DriveState } from '../state/drive-state';\nimport { DriveContextAction } from './types/drive-context-action';\nimport { Injectable } from '@angular/core';\nimport { WorkspacesService } from '../../../common/workspaces/workspaces.service';\nimport { OpenUploadWindow } from '../state/actions/commands';\nimport { CurrentUser } from '../../../common/auth/current-user';\nimport { DriveFolder } from '../folders/models/driveFolder';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport abstract class DriveContextActions {\n    protected multipleEntriesSelected: boolean;\n    protected allStarred: boolean;\n    protected onlyFoldersSelected: boolean;\n\n    protected abstract actions: DriveContextAction[];\n\n    constructor(\n        protected store: Store,\n        protected workspaces: WorkspacesService,\n        protected currentUser: CurrentUser,\n    ) {}\n\n    public getActions() {\n        this.updateStatus();\n        return this.actions;\n    }\n\n    protected getSelectedEntries() {\n        return this.store.selectSnapshot(DriveState.selectedEntries);\n    }\n\n    protected updateStatus() {\n        this.multipleEntriesSelected = this.store.selectSnapshot(DriveState.multipleEntriesSelected);\n        this.allStarred = this.store.selectSnapshot(DriveState.allSelectedEntriesStarred);\n        this.onlyFoldersSelected = this.store.selectSnapshot(DriveState.onlyFoldersSelected);\n    }\n\n    protected hasPermission(permission: string): boolean {\n        if (permission === 'files.create') {\n            const activeFolder = this.store.selectSnapshot(DriveState.activePage).folder;\n\n            // upload either to the folder user right clicked on or the folder that is currently open\n            const target = (!this.multipleEntriesSelected && this.getSelectedFolder()) || activeFolder;\n            return (target?.permissions || [])['files.update'];\n        } else {\n            return this.getSelectedEntries().every(entry => {\n                return entry.permissions[permission];\n            });\n        }\n    }\n\n    protected getSelectedFolder(): DriveFolder {\n        return this.getSelectedEntries().find(f => f.type === 'folder') as DriveFolder;\n    }\n\n    protected openUploadWindow(type: 'file'|'directory') {\n        this.store.dispatch(new OpenUploadWindow(type));\n    }\n}\n","import {\n    AddStar,\n    CopySelectedEntries,\n    DeleteSelectedEntries,\n    DownloadEntries,\n    OpenDialog,\n    OpenFilePreview,\n    RemoveStar\n} from '../../state/actions/commands';\nimport { ShareDialogComponent } from '../../sharing/share-dialog/share-dialog.component';\nimport { ShareLinkDialogComponent } from '../../sharing/share-link-dialog/share-link-dialog.component';\nimport { CrupdateFolderDialogComponent } from '../../folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\nimport { Injectable } from '@angular/core';\nimport { MoveEntriesDialogComponent } from '../../entries/move-entries-dialog/move-entries-dialog.component';\nimport { RenameEntryDialogComponent } from '../../entries/rename-entry-dialog/rename-entry-dialog.component';\nimport { DriveContextActions } from '../drive-context-actions';\nimport { DriveState } from '../../state/drive-state';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class EntryActions extends DriveContextActions {\n    protected actions = [\n        {\n            viewName: 'Preview',\n            icon: 'visibility',\n            showInCompact: true,\n            execute: () => {\n                this.store.dispatch(new OpenFilePreview());\n            },\n            visible: () => {\n                return !this.onlyFoldersSelected;\n            },\n        },\n        {\n            viewName: 'Manage People',\n            icon: 'person-add',\n            showInCompact: true,\n            execute: () => {\n                this.store.dispatch(new OpenDialog(ShareDialogComponent));\n            },\n            visible: () => this.hasPermission('files.update'),\n        },\n        {\n            viewName: 'Get shareable link',\n            icon: 'link',\n            execute: () => {\n                this.store.dispatch(new OpenDialog(ShareLinkDialogComponent, null, {\n                    panelClass: 'share-link-dialog-container',\n                    autoFocus: false,\n                }));\n            },\n            visible: () => !this.multipleEntriesSelected && this.hasPermission('files.update'),\n        },\n        {\n            viewName: 'Add a star',\n            icon: 'star',\n            execute: () => {\n                this.store.dispatch(new AddStar(this.getSelectedEntries()));\n            },\n            visible: () => !this.allStarred\n        },\n        {\n            viewName: 'Remove star',\n            icon: 'star-border',\n            execute: () => {\n                this.store.dispatch(new RemoveStar(this.getSelectedEntries()));\n            },\n            visible: () => this.allStarred\n        },\n        {\n            viewName: 'New Folder',\n            icon: 'create-new-folder',\n            separatorBefore: this.store.selectSnapshot(DriveState.isMobile),\n            execute: () => {\n                this.store.dispatch(new OpenDialog(CrupdateFolderDialogComponent, {folder: this.getSelectedFolder()}));\n            },\n            visible: () => this.hasPermission('files.create')\n        },\n        {\n            viewName: 'Upload Files',\n            icon: 'cloud-upload',\n            execute: () => {\n                this.openUploadWindow('file');\n            },\n            visible: () => this.hasPermission('files.create') && this.store.selectSnapshot(DriveState.isMobile),\n        },\n        {\n            viewName: 'Upload Folder',\n            icon: 'upload-folder-custom',\n            execute: () => {\n                this.openUploadWindow('directory');\n            },\n            visible: () => this.hasPermission('files.create') && this.store.selectSnapshot(DriveState.isMobile),\n        },\n        {\n            viewName: 'Move to',\n            icon: 'subdirectory-arrow-right',\n            separatorBefore: this.store.selectSnapshot(DriveState.isMobile),\n            execute: () => {\n                this.store.dispatch(new OpenDialog(MoveEntriesDialogComponent, null, {panelClass: 'move-entries-dialog-container'}));\n            },\n            visible: () => this.hasPermission('files.update'),\n        },\n        {\n            viewName: 'Rename',\n            icon: 'edit',\n            execute: () => {\n                this.store.dispatch(new OpenDialog(RenameEntryDialogComponent));\n            },\n            visible: () => {\n                return !this.multipleEntriesSelected && this.hasPermission('files.update');\n            }\n        },\n        {\n            viewName: 'Make a copy',\n            icon: 'file-copy',\n            execute: () => {\n                this.store.dispatch(new CopySelectedEntries());\n            },\n            visible: () => this.hasPermission('files.create'),\n        },\n        {\n            viewName: 'Download',\n            icon: 'file-download',\n            execute: () => {\n                this.store.dispatch(new DownloadEntries());\n            },\n            visible: () => this.hasPermission('files.download'),\n        },\n        {\n            viewName: 'Delete',\n            icon: 'delete',\n            showInCompact: true,\n            separatorBefore: true,\n            execute: () => {\n                this.store.dispatch(new DeleteSelectedEntries());\n            },\n            visible: () => this.hasPermission('files.delete'),\n        },\n    ];\n}\n","import { OpenDialog, } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\nimport { CrupdateFolderDialogComponent } from '../../folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class FolderActions extends DriveContextActions {\n    protected actions = [\n        {\n            viewName: 'New Folder',\n            icon: 'create-new-folder',\n            execute: () => {\n                this.store.dispatch(new OpenDialog(CrupdateFolderDialogComponent));\n            },\n            visible: () => this.hasPermission('files.create'),\n        },\n        {\n            viewName: 'Upload Files',\n            icon: 'cloud-upload',\n            separatorBefore: true,\n            execute: () => {\n                this.openUploadWindow('file');\n            },\n            visible: () => this.hasPermission('files.create'),\n        },\n        {\n            viewName: 'Upload Folder',\n            icon: 'upload-folder-custom',\n            execute: () => {\n                this.openUploadWindow('directory');\n            },\n            visible: () => this.hasPermission('files.create'),\n        },\n    ];\n}\n","import {\n    CopySelectedEntries, DownloadEntries, OpenDialog, OpenFilePreview, RemoveEntries,\n} from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\nimport { ShareLinkDialogComponent } from '../../sharing/share-link-dialog/share-link-dialog.component';\nimport { Store } from '@ngxs/store';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { SharesApiService } from '../../sharing/shares-api.service';\nimport { ShareDialogComponent } from '../../sharing/share-dialog/share-dialog.component';\nimport { RenameEntryDialogComponent } from '../../entries/rename-entry-dialog/rename-entry-dialog.component';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\n\nconst noopTrue = () => true;\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class SharesActions extends DriveContextActions {\n    protected actions = [\n        {\n            viewName: 'Preview',\n            icon: 'visibility',\n            execute: () => {\n                this.store.dispatch(new OpenFilePreview());\n            },\n            visible: () => {\n                return !this.onlyFoldersSelected;\n            },\n        },\n        {\n            viewName: 'Manage People',\n            icon: 'person-add',\n            showInCompact: true,\n            execute: () => {\n                this.store.dispatch(new OpenDialog(ShareDialogComponent));\n            },\n            visible: () => {\n                return this.hasPermission('files.update');\n            },\n        },\n        {\n            viewName: 'Get shareable link',\n            icon: 'link',\n            execute: () => {\n                this.store.dispatch(new OpenDialog(ShareLinkDialogComponent, null, {\n                    panelClass: 'share-link-dialog-container',\n                    autoFocus: false,\n                }));\n            },\n            visible: () => {\n                return !this.multipleEntriesSelected && this.hasPermission('files.update');\n            }\n        },\n        {\n            viewName: 'Rename',\n            icon: 'edit',\n            execute: () => {\n                this.store.dispatch(new OpenDialog(RenameEntryDialogComponent));\n            },\n            visible: () => {\n                return !this.multipleEntriesSelected && this.hasPermission('files.update');\n            }\n        },\n        {\n            viewName: 'Make a copy',\n            icon: 'file-copy',\n            execute: () => {\n                this.store.dispatch(new CopySelectedEntries());\n            },\n            visible: () => {\n                return this.hasPermission('files.download') && this.hasPermission('files.create');\n            },\n        },\n        {\n            viewName: 'Download',\n            icon: 'file-download',\n            execute: () => {\n                this.store.dispatch(new DownloadEntries());\n            },\n            visible: () => {\n                return this.hasPermission('files.download');\n            },\n        },\n        {\n            viewName: 'Remove',\n            icon: 'delete',\n            showInCompact: true,\n            execute: () => {\n                const entries = this.getSelectedEntries();\n                this.shares.detachUser(\n                    this.currentUser.get('id'),\n                    entries.map(e => e.id),\n                ).subscribe(() => {\n                    this.store.dispatch(new RemoveEntries(entries));\n                });\n            },\n            visible: noopTrue,\n        },\n    ];\n\n    constructor(\n        protected store: Store,\n        protected currentUser: CurrentUser,\n        protected shares: SharesApiService,\n        protected workspaces: WorkspacesService\n    ) {\n        super(store, workspaces, currentUser);\n    }\n}\n","import { DeleteTrashedEntriesForever, OpenConfirmDialog, RestoreTrashedEntries, } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class TrashActions extends DriveContextActions {\n    protected actions = [\n        {\n            viewName: 'Restore',\n            icon: 'restore',\n            showInCompact: true,\n            execute: () => {\n                this.store.dispatch(new RestoreTrashedEntries());\n            },\n            visible: () => this.hasPermission('files.update'),\n        },\n        {\n            viewName: 'Delete Forever',\n            icon: 'delete-forever',\n            showInCompact: true,\n            execute: () => {\n                this.deleteForever();\n            },\n            visible: () => this.hasPermission('files.delete'),\n        },\n    ];\n\n    public deleteForever() {\n        this.store.dispatch(new OpenConfirmDialog({\n            title: 'Delete Forever',\n            body: 'This will permanently delete selected items.',\n            bodyBold: 'This action can not be undone.',\n            ok: 'Delete Forever',\n        }, new DeleteTrashedEntriesForever()));\n    }\n}\n","import { EmptyTrash, OpenConfirmDialog, } from '../../state/actions/commands';\nimport { Injectable } from '@angular/core';\nimport { DriveContextActions } from '../drive-context-actions';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class TrashPageActions extends DriveContextActions {\n    protected actions = [\n        {\n            viewName: 'Empty Trash',\n            icon: 'delete-forever',\n            execute: () => {\n                this.emptyTrash();\n            },\n            visible: () => this.hasPermission('files.delete'),\n        },\n    ];\n\n    public emptyTrash() {\n        this.store.dispatch(new OpenConfirmDialog({\n            title: 'Empty Trash',\n            body: 'All files and folders in your trash will be permanently deleted.',\n            bodyBold: 'This action can not be undone.',\n            ok: 'Empty Trash'\n        }, new EmptyTrash()));\n    }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DriveDomCacheService {\n    public scrollCont: HTMLElement;\n    public filesCont: HTMLElement;\n    public filesContRect: ClientRect;\n    public scrollContRect: ClientRect;\n    public dragPreview: HTMLElement;\n}\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    OnDestroy,\n    OnInit,\n    ViewChild,\n} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {Store} from '@ngxs/store';\nimport {OpenSearchPage} from '../state/actions/commands';\nimport {debounceTime, distinctUntilChanged, skip, startWith} from 'rxjs/operators';\nimport {DriveEntryApiService} from '../drive-entry-api.service';\nimport {BehaviorSubject, combineLatest, Subscription} from 'rxjs';\nimport {Router} from '@angular/router';\nimport {RouterState} from '@ngxs/router-plugin';\nimport isEqual from 'lodash/isEqual';\nimport {DriveState} from '../state/drive-state';\nimport {SearchInputWithFiltersComponent} from '../../../common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.component';\nimport {driveSearchFilters} from './drive-search-filters';\nimport {CurrentUser} from '../../../common/auth/current-user';\n\n@Component({\n    selector: 'main-searchbar',\n    templateUrl: './main-searchbar.component.html',\n    styleUrls: ['./main-searchbar.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MainSearchbarComponent implements OnInit, OnDestroy {\n    @ViewChild(SearchInputWithFiltersComponent, {read: ElementRef, static: true})\n    searchEl: ElementRef<HTMLElement>;\n    filters = driveSearchFilters(this.currentUser);\n    searchControl = new FormControl();\n    filterChange$ = new BehaviorSubject<string>(null);\n    private metaSub: Subscription;\n\n    constructor(\n        private store: Store,\n        private driveApi: DriveEntryApiService,\n        private router: Router,\n        private currentUser: CurrentUser\n    ) {}\n\n    ngOnInit() {\n        // TODO: navigate from search page to drive homepage on blur\n        // TODO: refactor permissions into advanced and remove mail template stuff\n        this.metaSub = this.store.select(DriveState.meta).subscribe(meta => {\n            // make sure nav searchbar color is always white if there are any filters set\n            if (meta.query || meta.filters) {\n                this.searchEl.nativeElement.classList.add('always-white');\n            } else {\n                this.searchEl.nativeElement.classList.remove('always-white');\n            }\n        });\n\n        combineLatest([\n            this.searchControl.valueChanges.pipe(distinctUntilChanged(), startWith(null)),\n            this.filterChange$,\n        ])\n            // skip initial \"null\" values\n            .pipe(skip(1), debounceTime(0))\n            .subscribe(([query, filters]) => {\n                const params = {query, filters};\n                const oldParams = this.store.selectSnapshot(RouterState.state).root\n                    .queryParams;\n\n                // if both filter and query are null it means form was reset and \"resetForm\" fn will be called\n                const filtersOrQueryChanged =\n                    (query || filters) && !isEqual(oldParams, params);\n\n                if (filtersOrQueryChanged) {\n                    this.store.dispatch(new OpenSearchPage(params));\n                } else if (!filters && !query && this.inSearchPage()) {\n                    this.router.navigate(['/drive']);\n                }\n            });\n    }\n\n    ngOnDestroy() {\n        this.metaSub?.unsubscribe();\n    }\n\n    openSearchPage() {\n        // open search page on input focus if not already in search page\n        if (!this.inSearchPage()) {\n            this.store.dispatch(new OpenSearchPage());\n        }\n    }\n\n    private inSearchPage(): boolean {\n        return this.router.routerState.snapshot.url.includes('/drive/search');\n    }\n}\n","import {\n    DatatableFilter,\n    FilterControlType,\n    FilterOperator,\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';\nimport {FILE_ENTRY_TYPE_FILTER} from '../../../common/admin/file-entry-index/file-entry-index-filters';\nimport {CurrentUser} from '../../../common/auth/current-user';\n\nexport function driveSearchFilters(currentUSer: CurrentUser): DatatableFilter[] {\n    return [\n        FILE_ENTRY_TYPE_FILTER,\n        new DatatableFilter({\n            type: FilterControlType.Select,\n            key: 'owner_id',\n            label: 'Owner',\n            description: 'User that this file was uploaded by',\n            defaultValue: currentUSer.get('id'),\n            options: [\n                {key: 'Anyone', value: {value: null, operator: '!='}},\n                {key: 'Owned by me', value: currentUSer.get('id')},\n                {\n                    key: 'Not owned by me',\n                    value: {value: currentUSer.get('id'), operator: '!='},\n                },\n            ],\n        }),\n        new CreatedAtFilter({\n            description: 'Date file was uploaded',\n        }),\n        new UpdatedAtFilter({\n            description: 'Date file was last changed',\n        }),\n        new DatatableFilter({\n            type: FilterControlType.StaticValue,\n            key: 'deleted_at',\n            label: 'Trashed',\n            defaultOperator: FilterOperator.ne,\n            defaultValue: null,\n            description: 'Only show files that are in the trash',\n        }),\n        new DatatableFilter({\n            type: FilterControlType.StaticValue,\n            key: 'shareableLink',\n            label: 'Has Shareable Link',\n            description: 'Only show files that have a shareable link',\n            defaultValue: '*',\n            defaultOperator: FilterOperator.has,\n        }),\n        new DatatableFilter({\n            type: FilterControlType.StaticValue,\n            key: 'sharedByMe',\n            label: 'Shared By Me',\n            defaultValue: true,\n            description:\n                'Only show files that are shared with someone',\n        }),\n    ];\n}\n","<search-input-with-filters\n    class=\"nav-searchbar\"\n    [compact]=\"true\"\n    [searchControl]=\"searchControl\"\n    [filters]=\"filters\"\n    (inputFocus)=\"openSearchPage()\"\n    (filterChange)=\"filterChange$.next($event)\"\n    pluralName=\"files\"\n></search-input-with-filters>\n","import { Subscriber } from '../Subscriber';\nexport function mapTo(value) {\n    return (source) => source.lift(new MapToOperator(value));\n}\nclass MapToOperator {\n    constructor(value) {\n        this.value = value;\n    }\n    call(subscriber, source) {\n        return source.subscribe(new MapToSubscriber(subscriber, this.value));\n    }\n}\nclass MapToSubscriber extends Subscriber {\n    constructor(destination, value) {\n        super(destination);\n        this.value = value;\n    }\n    _next(x) {\n        this.destination.next(this.value);\n    }\n}\n//# sourceMappingURL=mapTo.js.map","import { Platform, PlatformModule } from '@angular/cdk/platform';\nimport { CdkScrollable, ScrollDispatcher, ViewportRuler, CdkScrollableModule } from '@angular/cdk/scrolling';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport { InjectionToken, Component, ChangeDetectionStrategy, ViewEncapsulation, ChangeDetectorRef, Inject, forwardRef, ElementRef, NgZone, EventEmitter, Optional, Input, HostBinding, Output, HostListener, QueryList, ContentChildren, ContentChild, ViewChild, NgModule } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\nimport { FocusTrapFactory, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';\nimport { Subject, fromEvent, merge } from 'rxjs';\nimport { filter, map, mapTo, takeUntil, distinctUntilChanged, take, startWith, debounceTime } from 'rxjs/operators';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Animations used by the Material drawers.\n * @docs-private\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/scrolling';\nimport * as ɵngcc2 from '@angular/cdk/a11y';\nimport * as ɵngcc3 from '@angular/cdk/platform';\nimport * as ɵngcc4 from '@angular/cdk/bidi';\nimport * as ɵngcc5 from '@angular/common';\n\nconst _c0 = [\"*\"];\nfunction MatDrawerContainer_div_0_Template(rf, ctx) { if (rf & 1) {\n    const _r3 = ɵngcc0.ɵɵgetCurrentView();\n    ɵngcc0.ɵɵelementStart(0, \"div\", 2);\n    ɵngcc0.ɵɵlistener(\"click\", function MatDrawerContainer_div_0_Template_div_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r3); const ctx_r2 = ɵngcc0.ɵɵnextContext(); return ctx_r2._onBackdropClicked(); });\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r0 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵclassProp(\"mat-drawer-shown\", ctx_r0._isShowingBackdrop());\n} }\nfunction MatDrawerContainer_mat_drawer_content_3_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"mat-drawer-content\");\n    ɵngcc0.ɵɵprojection(1, 2);\n    ɵngcc0.ɵɵelementEnd();\n} }\nconst _c1 = [[[\"mat-drawer\"]], [[\"mat-drawer-content\"]], \"*\"];\nconst _c2 = [\"mat-drawer\", \"mat-drawer-content\", \"*\"];\nfunction MatSidenavContainer_div_0_Template(rf, ctx) { if (rf & 1) {\n    const _r3 = ɵngcc0.ɵɵgetCurrentView();\n    ɵngcc0.ɵɵelementStart(0, \"div\", 2);\n    ɵngcc0.ɵɵlistener(\"click\", function MatSidenavContainer_div_0_Template_div_click_0_listener() { ɵngcc0.ɵɵrestoreView(_r3); const ctx_r2 = ɵngcc0.ɵɵnextContext(); return ctx_r2._onBackdropClicked(); });\n    ɵngcc0.ɵɵelementEnd();\n} if (rf & 2) {\n    const ctx_r0 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵclassProp(\"mat-drawer-shown\", ctx_r0._isShowingBackdrop());\n} }\nfunction MatSidenavContainer_mat_sidenav_content_3_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵelementStart(0, \"mat-sidenav-content\", 3);\n    ɵngcc0.ɵɵprojection(1, 2);\n    ɵngcc0.ɵɵelementEnd();\n} }\nconst _c3 = [[[\"mat-sidenav\"]], [[\"mat-sidenav-content\"]], \"*\"];\nconst _c4 = [\"mat-sidenav\", \"mat-sidenav-content\", \"*\"];\nconst _c5 = \".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\\n\";\nconst matDrawerAnimations = {\n    /** Animation that slides a drawer in and out. */\n    transformDrawer: trigger('transform', [\n        // We remove the `transform` here completely, rather than setting it to zero, because:\n        // 1. Having a transform can cause elements with ripples or an animated\n        //    transform to shift around in Chrome with an RTL layout (see #10023).\n        // 2. 3d transforms causes text to appear blurry on IE and Edge.\n        state('open, open-instant', style({\n            'transform': 'none',\n            'visibility': 'visible',\n        })),\n        state('void', style({\n            // Avoids the shadow showing up when closed in SSR.\n            'box-shadow': 'none',\n            'visibility': 'hidden',\n        })),\n        transition('void => open-instant', animate('0ms')),\n        transition('void <=> open, open-instant => void', animate('400ms cubic-bezier(0.25, 0.8, 0.25, 1)'))\n    ])\n};\n\n/**\n * Throws an exception when two MatDrawer are matching the same position.\n * @docs-private\n */\nfunction throwMatDuplicatedDrawerError(position) {\n    throw Error(`A drawer was already declared for 'position=\"${position}\"'`);\n}\n/** Configures whether drawers should use auto sizing by default. */\nconst MAT_DRAWER_DEFAULT_AUTOSIZE = new InjectionToken('MAT_DRAWER_DEFAULT_AUTOSIZE', {\n    providedIn: 'root',\n    factory: MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY,\n});\n/**\n * Used to provide a drawer container to a drawer while avoiding circular references.\n * @docs-private\n */\nconst MAT_DRAWER_CONTAINER = new InjectionToken('MAT_DRAWER_CONTAINER');\n/** @docs-private */\nfunction MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY() {\n    return false;\n}\nclass MatDrawerContent extends CdkScrollable {\n    constructor(_changeDetectorRef, _container, elementRef, scrollDispatcher, ngZone) {\n        super(elementRef, scrollDispatcher, ngZone);\n        this._changeDetectorRef = _changeDetectorRef;\n        this._container = _container;\n    }\n    ngAfterContentInit() {\n        this._container._contentMarginChanges.subscribe(() => {\n            this._changeDetectorRef.markForCheck();\n        });\n    }\n}\nMatDrawerContent.ɵfac = function MatDrawerContent_Factory(t) { return new (t || MatDrawerContent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(forwardRef(() => MatDrawerContainer)), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ScrollDispatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nMatDrawerContent.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatDrawerContent, selectors: [[\"mat-drawer-content\"]], hostAttrs: [1, \"mat-drawer-content\"], hostVars: 4, hostBindings: function MatDrawerContent_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵstyleProp(\"margin-left\", ctx._container._contentMargins.left, \"px\")(\"margin-right\", ctx._container._contentMargins.right, \"px\");\n    } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function MatDrawerContent_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵprojection(0);\n    } }, encapsulation: 2, changeDetection: 0 });\nMatDrawerContent.ctorParameters = () => [\n    { type: ChangeDetectorRef },\n    { type: MatDrawerContainer, decorators: [{ type: Inject, args: [forwardRef(() => MatDrawerContainer),] }] },\n    { type: ElementRef },\n    { type: ScrollDispatcher },\n    { type: NgZone }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDrawerContent, [{\n        type: Component,\n        args: [{\n                selector: 'mat-drawer-content',\n                template: '<ng-content></ng-content>',\n                host: {\n                    'class': 'mat-drawer-content',\n                    '[style.margin-left.px]': '_container._contentMargins.left',\n                    '[style.margin-right.px]': '_container._contentMargins.right'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None\n            }]\n    }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: MatDrawerContainer, decorators: [{\n                type: Inject,\n                args: [forwardRef(() => MatDrawerContainer)]\n            }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ScrollDispatcher }, { type: ɵngcc0.NgZone }]; }, null); })();\n/**\n * This component corresponds to a drawer that can be opened on the drawer container.\n */\nclass MatDrawer {\n    constructor(_elementRef, _focusTrapFactory, _focusMonitor, _platform, _ngZone, _doc, _container) {\n        this._elementRef = _elementRef;\n        this._focusTrapFactory = _focusTrapFactory;\n        this._focusMonitor = _focusMonitor;\n        this._platform = _platform;\n        this._ngZone = _ngZone;\n        this._doc = _doc;\n        this._container = _container;\n        this._elementFocusedBeforeDrawerWasOpened = null;\n        /** Whether the drawer is initialized. Used for disabling the initial animation. */\n        this._enableAnimations = false;\n        this._position = 'start';\n        this._mode = 'over';\n        this._disableClose = false;\n        this._opened = false;\n        /** Emits whenever the drawer has started animating. */\n        this._animationStarted = new Subject();\n        /** Emits whenever the drawer is done animating. */\n        this._animationEnd = new Subject();\n        /** Current state of the sidenav animation. */\n        // @HostBinding is used in the class as it is expected to be extended.  Since @Component decorator\n        // metadata is not inherited by child classes, instead the host binding data is defined in a way\n        // that can be inherited.\n        // tslint:disable:no-host-decorator-in-concrete\n        this._animationState = 'void';\n        /** Event emitted when the drawer open state is changed. */\n        this.openedChange = \n        // Note this has to be async in order to avoid some issues with two-bindings (see #8872).\n        new EventEmitter(/* isAsync */ true);\n        /** Event emitted when the drawer has been opened. */\n        this._openedStream = this.openedChange.pipe(filter(o => o), map(() => { }));\n        /** Event emitted when the drawer has started opening. */\n        this.openedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState.indexOf('open') === 0), mapTo(undefined));\n        /** Event emitted when the drawer has been closed. */\n        this._closedStream = this.openedChange.pipe(filter(o => !o), map(() => { }));\n        /** Event emitted when the drawer has started closing. */\n        this.closedStart = this._animationStarted.pipe(filter(e => e.fromState !== e.toState && e.toState === 'void'), mapTo(undefined));\n        /** Emits when the component is destroyed. */\n        this._destroyed = new Subject();\n        /** Event emitted when the drawer's position changes. */\n        // tslint:disable-next-line:no-output-on-prefix\n        this.onPositionChanged = new EventEmitter();\n        /**\n         * An observable that emits when the drawer mode changes. This is used by the drawer container to\n         * to know when to when the mode changes so it can adapt the margins on the content.\n         */\n        this._modeChanged = new Subject();\n        this.openedChange.subscribe((opened) => {\n            if (opened) {\n                if (this._doc) {\n                    this._elementFocusedBeforeDrawerWasOpened = this._doc.activeElement;\n                }\n                this._takeFocus();\n            }\n            else if (this._isFocusWithinDrawer()) {\n                this._restoreFocus();\n            }\n        });\n        /**\n         * Listen to `keydown` events outside the zone so that change detection is not run every\n         * time a key is pressed. Instead we re-enter the zone only if the `ESC` key is pressed\n         * and we don't have close disabled.\n         */\n        this._ngZone.runOutsideAngular(() => {\n            fromEvent(this._elementRef.nativeElement, 'keydown').pipe(filter(event => {\n                return event.keyCode === ESCAPE && !this.disableClose && !hasModifierKey(event);\n            }), takeUntil(this._destroyed)).subscribe(event => this._ngZone.run(() => {\n                this.close();\n                event.stopPropagation();\n                event.preventDefault();\n            }));\n        });\n        // We need a Subject with distinctUntilChanged, because the `done` event\n        // fires twice on some browsers. See https://github.com/angular/angular/issues/24084\n        this._animationEnd.pipe(distinctUntilChanged((x, y) => {\n            return x.fromState === y.fromState && x.toState === y.toState;\n        })).subscribe((event) => {\n            const { fromState, toState } = event;\n            if ((toState.indexOf('open') === 0 && fromState === 'void') ||\n                (toState === 'void' && fromState.indexOf('open') === 0)) {\n                this.openedChange.emit(this._opened);\n            }\n        });\n    }\n    /** The side that the drawer is attached to. */\n    get position() { return this._position; }\n    set position(value) {\n        // Make sure we have a valid value.\n        value = value === 'end' ? 'end' : 'start';\n        if (value != this._position) {\n            this._position = value;\n            this.onPositionChanged.emit();\n        }\n    }\n    /** Mode of the drawer; one of 'over', 'push' or 'side'. */\n    get mode() { return this._mode; }\n    set mode(value) {\n        this._mode = value;\n        this._updateFocusTrapState();\n        this._modeChanged.next();\n    }\n    /** Whether the drawer can be closed with the escape key or by clicking on the backdrop. */\n    get disableClose() { return this._disableClose; }\n    set disableClose(value) { this._disableClose = coerceBooleanProperty(value); }\n    /**\n     * Whether the drawer should focus the first focusable element automatically when opened.\n     * Defaults to false in when `mode` is set to `side`, otherwise defaults to `true`. If explicitly\n     * enabled, focus will be moved into the sidenav in `side` mode as well.\n     */\n    get autoFocus() {\n        const value = this._autoFocus;\n        // Note that usually we disable auto focusing in `side` mode, because we don't know how the\n        // sidenav is being used, but in some cases it still makes sense to do it. If the consumer\n        // explicitly enabled `autoFocus`, we take it as them always wanting to enable it.\n        return value == null ? this.mode !== 'side' : value;\n    }\n    set autoFocus(value) { this._autoFocus = coerceBooleanProperty(value); }\n    /**\n     * Whether the drawer is opened. We overload this because we trigger an event when it\n     * starts or end.\n     */\n    get opened() { return this._opened; }\n    set opened(value) { this.toggle(coerceBooleanProperty(value)); }\n    /**\n     * Moves focus into the drawer. Note that this works even if\n     * the focus trap is disabled in `side` mode.\n     */\n    _takeFocus() {\n        if (!this.autoFocus || !this._focusTrap) {\n            return;\n        }\n        this._focusTrap.focusInitialElementWhenReady().then(hasMovedFocus => {\n            // If there were no focusable elements, focus the sidenav itself so the keyboard navigation\n            // still works. We need to check that `focus` is a function due to Universal.\n            if (!hasMovedFocus && typeof this._elementRef.nativeElement.focus === 'function') {\n                this._elementRef.nativeElement.focus();\n            }\n        });\n    }\n    /**\n     * Restores focus to the element that was originally focused when the drawer opened.\n     * If no element was focused at that time, the focus will be restored to the drawer.\n     */\n    _restoreFocus() {\n        if (!this.autoFocus) {\n            return;\n        }\n        // Note that we don't check via `instanceof HTMLElement` so that we can cover SVGs as well.\n        if (this._elementFocusedBeforeDrawerWasOpened) {\n            this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened, this._openedVia);\n        }\n        else {\n            this._elementRef.nativeElement.blur();\n        }\n        this._elementFocusedBeforeDrawerWasOpened = null;\n        this._openedVia = null;\n    }\n    /** Whether focus is currently within the drawer. */\n    _isFocusWithinDrawer() {\n        var _a;\n        const activeEl = (_a = this._doc) === null || _a === void 0 ? void 0 : _a.activeElement;\n        return !!activeEl && this._elementRef.nativeElement.contains(activeEl);\n    }\n    ngAfterContentInit() {\n        this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);\n        this._updateFocusTrapState();\n    }\n    ngAfterContentChecked() {\n        // Enable the animations after the lifecycle hooks have run, in order to avoid animating\n        // drawers that are open by default. When we're on the server, we shouldn't enable the\n        // animations, because we don't want the drawer to animate the first time the user sees\n        // the page.\n        if (this._platform.isBrowser) {\n            this._enableAnimations = true;\n        }\n    }\n    ngOnDestroy() {\n        if (this._focusTrap) {\n            this._focusTrap.destroy();\n        }\n        this._animationStarted.complete();\n        this._animationEnd.complete();\n        this._modeChanged.complete();\n        this._destroyed.next();\n        this._destroyed.complete();\n    }\n    /**\n     * Open the drawer.\n     * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n     * Used for focus management after the sidenav is closed.\n     */\n    open(openedVia) {\n        return this.toggle(true, openedVia);\n    }\n    /** Close the drawer. */\n    close() {\n        return this.toggle(false);\n    }\n    /** Closes the drawer with context that the backdrop was clicked. */\n    _closeViaBackdropClick() {\n        // If the drawer is closed upon a backdrop click, we always want to restore focus. We\n        // don't need to check whether focus is currently in the drawer, as clicking on the\n        // backdrop causes blurring of the active element.\n        return this._setOpen(/* isOpen */ false, /* restoreFocus */ true);\n    }\n    /**\n     * Toggle this drawer.\n     * @param isOpen Whether the drawer should be open.\n     * @param openedVia Whether the drawer was opened by a key press, mouse click or programmatically.\n     * Used for focus management after the sidenav is closed.\n     */\n    toggle(isOpen = !this.opened, openedVia) {\n        // If the focus is currently inside the drawer content and we are closing the drawer,\n        // restore the focus to the initially focused element (when the drawer opened).\n        return this._setOpen(isOpen, /* restoreFocus */ !isOpen && this._isFocusWithinDrawer(), openedVia);\n    }\n    /**\n     * Toggles the opened state of the drawer.\n     * @param isOpen Whether the drawer should open or close.\n     * @param restoreFocus Whether focus should be restored on close.\n     * @param openedVia Focus origin that can be optionally set when opening a drawer. The\n     *   origin will be used later when focus is restored on drawer close.\n     */\n    _setOpen(isOpen, restoreFocus, openedVia = 'program') {\n        this._opened = isOpen;\n        if (isOpen) {\n            this._animationState = this._enableAnimations ? 'open' : 'open-instant';\n            this._openedVia = openedVia;\n        }\n        else {\n            this._animationState = 'void';\n            if (restoreFocus) {\n                this._restoreFocus();\n            }\n        }\n        this._updateFocusTrapState();\n        return new Promise(resolve => {\n            this.openedChange.pipe(take(1)).subscribe(open => resolve(open ? 'open' : 'close'));\n        });\n    }\n    _getWidth() {\n        return this._elementRef.nativeElement ? (this._elementRef.nativeElement.offsetWidth || 0) : 0;\n    }\n    /** Updates the enabled state of the focus trap. */\n    _updateFocusTrapState() {\n        if (this._focusTrap) {\n            // The focus trap is only enabled when the drawer is open in any mode other than side.\n            this._focusTrap.enabled = this.opened && this.mode !== 'side';\n        }\n    }\n    // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n    // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n    // ViewEngine they're overwritten.\n    // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n    // tslint:disable-next-line:no-host-decorator-in-concrete\n    _animationStartListener(event) {\n        this._animationStarted.next(event);\n    }\n    // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n    // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n    // ViewEngine they're overwritten.\n    // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n    // tslint:disable-next-line:no-host-decorator-in-concrete\n    _animationDoneListener(event) {\n        this._animationEnd.next(event);\n    }\n}\nMatDrawer.ɵfac = function MatDrawer_Factory(t) { return new (t || MatDrawer)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FocusTrapFactory), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc3.Platform), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(MAT_DRAWER_CONTAINER, 8)); };\nMatDrawer.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatDrawer, selectors: [[\"mat-drawer\"]], hostAttrs: [\"tabIndex\", \"-1\", 1, \"mat-drawer\"], hostVars: 12, hostBindings: function MatDrawer_HostBindings(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵsyntheticHostListener(\"@transform.start\", function MatDrawer_animation_transform_start_HostBindingHandler($event) { return ctx._animationStartListener($event); })(\"@transform.done\", function MatDrawer_animation_transform_done_HostBindingHandler($event) { return ctx._animationDoneListener($event); });\n    } if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"align\", null);\n        ɵngcc0.ɵɵsyntheticHostProperty(\"@transform\", ctx._animationState);\n        ɵngcc0.ɵɵclassProp(\"mat-drawer-end\", ctx.position === \"end\")(\"mat-drawer-over\", ctx.mode === \"over\")(\"mat-drawer-push\", ctx.mode === \"push\")(\"mat-drawer-side\", ctx.mode === \"side\")(\"mat-drawer-opened\", ctx.opened);\n    } }, inputs: { position: \"position\", mode: \"mode\", disableClose: \"disableClose\", autoFocus: \"autoFocus\", opened: \"opened\" }, outputs: { openedChange: \"openedChange\", _openedStream: \"opened\", openedStart: \"openedStart\", _closedStream: \"closed\", closedStart: \"closedStart\", onPositionChanged: \"positionChanged\" }, exportAs: [\"matDrawer\"], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[\"cdkScrollable\", \"\", 1, \"mat-drawer-inner-container\"]], template: function MatDrawer_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n        ɵngcc0.ɵɵprojection(1);\n        ɵngcc0.ɵɵelementEnd();\n    } }, directives: [ɵngcc1.CdkScrollable], encapsulation: 2, data: { animation: [matDrawerAnimations.transformDrawer] }, changeDetection: 0 });\nMatDrawer.ctorParameters = () => [\n    { type: ElementRef },\n    { type: FocusTrapFactory },\n    { type: FocusMonitor },\n    { type: Platform },\n    { type: NgZone },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n    { type: MatDrawerContainer, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DRAWER_CONTAINER,] }] }\n];\nMatDrawer.propDecorators = {\n    position: [{ type: Input }],\n    mode: [{ type: Input }],\n    disableClose: [{ type: Input }],\n    autoFocus: [{ type: Input }],\n    opened: [{ type: Input }],\n    _animationState: [{ type: HostBinding, args: ['@transform',] }],\n    openedChange: [{ type: Output }],\n    _openedStream: [{ type: Output, args: ['opened',] }],\n    openedStart: [{ type: Output }],\n    _closedStream: [{ type: Output, args: ['closed',] }],\n    closedStart: [{ type: Output }],\n    onPositionChanged: [{ type: Output, args: ['positionChanged',] }],\n    _animationStartListener: [{ type: HostListener, args: ['@transform.start', ['$event'],] }],\n    _animationDoneListener: [{ type: HostListener, args: ['@transform.done', ['$event'],] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDrawer, [{\n        type: Component,\n        args: [{\n                selector: 'mat-drawer',\n                exportAs: 'matDrawer',\n                template: \"<div class=\\\"mat-drawer-inner-container\\\" cdkScrollable>\\r\\n  <ng-content></ng-content>\\r\\n</div>\\r\\n\",\n                animations: [matDrawerAnimations.transformDrawer],\n                host: {\n                    'class': 'mat-drawer',\n                    // must prevent the browser from aligning text based on value\n                    '[attr.align]': 'null',\n                    '[class.mat-drawer-end]': 'position === \"end\"',\n                    '[class.mat-drawer-over]': 'mode === \"over\"',\n                    '[class.mat-drawer-push]': 'mode === \"push\"',\n                    '[class.mat-drawer-side]': 'mode === \"side\"',\n                    '[class.mat-drawer-opened]': 'opened',\n                    'tabIndex': '-1'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc2.FocusTrapFactory }, { type: ɵngcc2.FocusMonitor }, { type: ɵngcc3.Platform }, { type: ɵngcc0.NgZone }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: MatDrawerContainer, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [MAT_DRAWER_CONTAINER]\n            }] }]; }, { _animationState: [{\n            type: HostBinding,\n            args: ['@transform']\n        }], openedChange: [{\n            type: Output\n        }], _openedStream: [{\n            type: Output,\n            args: ['opened']\n        }], openedStart: [{\n            type: Output\n        }], _closedStream: [{\n            type: Output,\n            args: ['closed']\n        }], closedStart: [{\n            type: Output\n        }], onPositionChanged: [{\n            type: Output,\n            args: ['positionChanged']\n        }], position: [{\n            type: Input\n        }], mode: [{\n            type: Input\n        }], disableClose: [{\n            type: Input\n        }], autoFocus: [{\n            type: Input\n        }], opened: [{\n            type: Input\n        }], \n    // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n    // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n    // ViewEngine they're overwritten.\n    // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n    // tslint:disable-next-line:no-host-decorator-in-concrete\n    _animationStartListener: [{\n            type: HostListener,\n            args: ['@transform.start', ['$event']]\n        }], \n    // We have to use a `HostListener` here in order to support both Ivy and ViewEngine.\n    // In Ivy the `host` bindings will be merged when this class is extended, whereas in\n    // ViewEngine they're overwritten.\n    // TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.\n    // tslint:disable-next-line:no-host-decorator-in-concrete\n    _animationDoneListener: [{\n            type: HostListener,\n            args: ['@transform.done', ['$event']]\n        }] }); })();\n/**\n * `<mat-drawer-container>` component.\n *\n * This is the parent component to one or two `<mat-drawer>`s that validates the state internally\n * and coordinates the backdrop and content styling.\n */\nclass MatDrawerContainer {\n    constructor(_dir, _element, _ngZone, _changeDetectorRef, viewportRuler, defaultAutosize = false, _animationMode) {\n        this._dir = _dir;\n        this._element = _element;\n        this._ngZone = _ngZone;\n        this._changeDetectorRef = _changeDetectorRef;\n        this._animationMode = _animationMode;\n        /** Drawers that belong to this container. */\n        this._drawers = new QueryList();\n        /** Event emitted when the drawer backdrop is clicked. */\n        this.backdropClick = new EventEmitter();\n        /** Emits when the component is destroyed. */\n        this._destroyed = new Subject();\n        /** Emits on every ngDoCheck. Used for debouncing reflows. */\n        this._doCheckSubject = new Subject();\n        /**\n         * Margins to be applied to the content. These are used to push / shrink the drawer content when a\n         * drawer is open. We use margin rather than transform even for push mode because transform breaks\n         * fixed position elements inside of the transformed element.\n         */\n        this._contentMargins = { left: null, right: null };\n        this._contentMarginChanges = new Subject();\n        // If a `Dir` directive exists up the tree, listen direction changes\n        // and update the left/right properties to point to the proper start/end.\n        if (_dir) {\n            _dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {\n                this._validateDrawers();\n                this.updateContentMargins();\n            });\n        }\n        // Since the minimum width of the sidenav depends on the viewport width,\n        // we need to recompute the margins if the viewport changes.\n        viewportRuler.change()\n            .pipe(takeUntil(this._destroyed))\n            .subscribe(() => this.updateContentMargins());\n        this._autosize = defaultAutosize;\n    }\n    /** The drawer child with the `start` position. */\n    get start() { return this._start; }\n    /** The drawer child with the `end` position. */\n    get end() { return this._end; }\n    /**\n     * Whether to automatically resize the container whenever\n     * the size of any of its drawers changes.\n     *\n     * **Use at your own risk!** Enabling this option can cause layout thrashing by measuring\n     * the drawers on every change detection cycle. Can be configured globally via the\n     * `MAT_DRAWER_DEFAULT_AUTOSIZE` token.\n     */\n    get autosize() { return this._autosize; }\n    set autosize(value) { this._autosize = coerceBooleanProperty(value); }\n    /**\n     * Whether the drawer container should have a backdrop while one of the sidenavs is open.\n     * If explicitly set to `true`, the backdrop will be enabled for drawers in the `side`\n     * mode as well.\n     */\n    get hasBackdrop() {\n        if (this._backdropOverride == null) {\n            return !this._start || this._start.mode !== 'side' || !this._end || this._end.mode !== 'side';\n        }\n        return this._backdropOverride;\n    }\n    set hasBackdrop(value) {\n        this._backdropOverride = value == null ? null : coerceBooleanProperty(value);\n    }\n    /** Reference to the CdkScrollable instance that wraps the scrollable content. */\n    get scrollable() {\n        return this._userContent || this._content;\n    }\n    ngAfterContentInit() {\n        this._allDrawers.changes\n            .pipe(startWith(this._allDrawers), takeUntil(this._destroyed))\n            .subscribe((drawer) => {\n            this._drawers.reset(drawer.filter(item => !item._container || item._container === this));\n            this._drawers.notifyOnChanges();\n        });\n        this._drawers.changes.pipe(startWith(null)).subscribe(() => {\n            this._validateDrawers();\n            this._drawers.forEach((drawer) => {\n                this._watchDrawerToggle(drawer);\n                this._watchDrawerPosition(drawer);\n                this._watchDrawerMode(drawer);\n            });\n            if (!this._drawers.length ||\n                this._isDrawerOpen(this._start) ||\n                this._isDrawerOpen(this._end)) {\n                this.updateContentMargins();\n            }\n            this._changeDetectorRef.markForCheck();\n        });\n        // Avoid hitting the NgZone through the debounce timeout.\n        this._ngZone.runOutsideAngular(() => {\n            this._doCheckSubject.pipe(debounceTime(10), // Arbitrary debounce time, less than a frame at 60fps\n            takeUntil(this._destroyed)).subscribe(() => this.updateContentMargins());\n        });\n    }\n    ngOnDestroy() {\n        this._contentMarginChanges.complete();\n        this._doCheckSubject.complete();\n        this._drawers.destroy();\n        this._destroyed.next();\n        this._destroyed.complete();\n    }\n    /** Calls `open` of both start and end drawers */\n    open() {\n        this._drawers.forEach(drawer => drawer.open());\n    }\n    /** Calls `close` of both start and end drawers */\n    close() {\n        this._drawers.forEach(drawer => drawer.close());\n    }\n    /**\n     * Recalculates and updates the inline styles for the content. Note that this should be used\n     * sparingly, because it causes a reflow.\n     */\n    updateContentMargins() {\n        // 1. For drawers in `over` mode, they don't affect the content.\n        // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the\n        //    left margin (for left drawer) or right margin (for right the drawer).\n        // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by\n        //    adding to the left or right margin and simultaneously subtracting the same amount of\n        //    margin from the other side.\n        let left = 0;\n        let right = 0;\n        if (this._left && this._left.opened) {\n            if (this._left.mode == 'side') {\n                left += this._left._getWidth();\n            }\n            else if (this._left.mode == 'push') {\n                const width = this._left._getWidth();\n                left += width;\n                right -= width;\n            }\n        }\n        if (this._right && this._right.opened) {\n            if (this._right.mode == 'side') {\n                right += this._right._getWidth();\n            }\n            else if (this._right.mode == 'push') {\n                const width = this._right._getWidth();\n                right += width;\n                left -= width;\n            }\n        }\n        // If either `right` or `left` is zero, don't set a style to the element. This\n        // allows users to specify a custom size via CSS class in SSR scenarios where the\n        // measured widths will always be zero. Note that we reset to `null` here, rather\n        // than below, in order to ensure that the types in the `if` below are consistent.\n        left = left || null;\n        right = right || null;\n        if (left !== this._contentMargins.left || right !== this._contentMargins.right) {\n            this._contentMargins = { left, right };\n            // Pull back into the NgZone since in some cases we could be outside. We need to be careful\n            // to do it only when something changed, otherwise we can end up hitting the zone too often.\n            this._ngZone.run(() => this._contentMarginChanges.next(this._contentMargins));\n        }\n    }\n    ngDoCheck() {\n        // If users opted into autosizing, do a check every change detection cycle.\n        if (this._autosize && this._isPushed()) {\n            // Run outside the NgZone, otherwise the debouncer will throw us into an infinite loop.\n            this._ngZone.runOutsideAngular(() => this._doCheckSubject.next());\n        }\n    }\n    /**\n     * Subscribes to drawer events in order to set a class on the main container element when the\n     * drawer is open and the backdrop is visible. This ensures any overflow on the container element\n     * is properly hidden.\n     */\n    _watchDrawerToggle(drawer) {\n        drawer._animationStarted.pipe(filter((event) => event.fromState !== event.toState), takeUntil(this._drawers.changes))\n            .subscribe((event) => {\n            // Set the transition class on the container so that the animations occur. This should not\n            // be set initially because animations should only be triggered via a change in state.\n            if (event.toState !== 'open-instant' && this._animationMode !== 'NoopAnimations') {\n                this._element.nativeElement.classList.add('mat-drawer-transition');\n            }\n            this.updateContentMargins();\n            this._changeDetectorRef.markForCheck();\n        });\n        if (drawer.mode !== 'side') {\n            drawer.openedChange.pipe(takeUntil(this._drawers.changes)).subscribe(() => this._setContainerClass(drawer.opened));\n        }\n    }\n    /**\n     * Subscribes to drawer onPositionChanged event in order to\n     * re-validate drawers when the position changes.\n     */\n    _watchDrawerPosition(drawer) {\n        if (!drawer) {\n            return;\n        }\n        // NOTE: We need to wait for the microtask queue to be empty before validating,\n        // since both drawers may be swapping positions at the same time.\n        drawer.onPositionChanged.pipe(takeUntil(this._drawers.changes)).subscribe(() => {\n            this._ngZone.onMicrotaskEmpty.pipe(take(1)).subscribe(() => {\n                this._validateDrawers();\n            });\n        });\n    }\n    /** Subscribes to changes in drawer mode so we can run change detection. */\n    _watchDrawerMode(drawer) {\n        if (drawer) {\n            drawer._modeChanged.pipe(takeUntil(merge(this._drawers.changes, this._destroyed)))\n                .subscribe(() => {\n                this.updateContentMargins();\n                this._changeDetectorRef.markForCheck();\n            });\n        }\n    }\n    /** Toggles the 'mat-drawer-opened' class on the main 'mat-drawer-container' element. */\n    _setContainerClass(isAdd) {\n        const classList = this._element.nativeElement.classList;\n        const className = 'mat-drawer-container-has-open';\n        if (isAdd) {\n            classList.add(className);\n        }\n        else {\n            classList.remove(className);\n        }\n    }\n    /** Validate the state of the drawer children components. */\n    _validateDrawers() {\n        this._start = this._end = null;\n        // Ensure that we have at most one start and one end drawer.\n        this._drawers.forEach(drawer => {\n            if (drawer.position == 'end') {\n                if (this._end != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n                    throwMatDuplicatedDrawerError('end');\n                }\n                this._end = drawer;\n            }\n            else {\n                if (this._start != null && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n                    throwMatDuplicatedDrawerError('start');\n                }\n                this._start = drawer;\n            }\n        });\n        this._right = this._left = null;\n        // Detect if we're LTR or RTL.\n        if (this._dir && this._dir.value === 'rtl') {\n            this._left = this._end;\n            this._right = this._start;\n        }\n        else {\n            this._left = this._start;\n            this._right = this._end;\n        }\n    }\n    /** Whether the container is being pushed to the side by one of the drawers. */\n    _isPushed() {\n        return (this._isDrawerOpen(this._start) && this._start.mode != 'over') ||\n            (this._isDrawerOpen(this._end) && this._end.mode != 'over');\n    }\n    _onBackdropClicked() {\n        this.backdropClick.emit();\n        this._closeModalDrawersViaBackdrop();\n    }\n    _closeModalDrawersViaBackdrop() {\n        // Close all open drawers where closing is not disabled and the mode is not `side`.\n        [this._start, this._end]\n            .filter(drawer => drawer && !drawer.disableClose && this._canHaveBackdrop(drawer))\n            .forEach(drawer => drawer._closeViaBackdropClick());\n    }\n    _isShowingBackdrop() {\n        return (this._isDrawerOpen(this._start) && this._canHaveBackdrop(this._start)) ||\n            (this._isDrawerOpen(this._end) && this._canHaveBackdrop(this._end));\n    }\n    _canHaveBackdrop(drawer) {\n        return drawer.mode !== 'side' || !!this._backdropOverride;\n    }\n    _isDrawerOpen(drawer) {\n        return drawer != null && drawer.opened;\n    }\n}\nMatDrawerContainer.ɵfac = function MatDrawerContainer_Factory(t) { return new (t || MatDrawerContainer)(ɵngcc0.ɵɵdirectiveInject(ɵngcc4.Directionality, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ViewportRuler), ɵngcc0.ɵɵdirectiveInject(MAT_DRAWER_DEFAULT_AUTOSIZE), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8)); };\nMatDrawerContainer.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatDrawerContainer, selectors: [[\"mat-drawer-container\"]], contentQueries: function MatDrawerContainer_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatDrawerContent, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatDrawer, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._content = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._allDrawers = _t);\n    } }, viewQuery: function MatDrawerContainer_Query(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵviewQuery(MatDrawerContent, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._userContent = _t.first);\n    } }, hostAttrs: [1, \"mat-drawer-container\"], hostVars: 2, hostBindings: function MatDrawerContainer_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵclassProp(\"mat-drawer-container-explicit-backdrop\", ctx._backdropOverride);\n    } }, inputs: { autosize: \"autosize\", hasBackdrop: \"hasBackdrop\" }, outputs: { backdropClick: \"backdropClick\" }, exportAs: [\"matDrawerContainer\"], features: [ɵngcc0.ɵɵProvidersFeature([{\n                provide: MAT_DRAWER_CONTAINER,\n                useExisting: MatDrawerContainer\n            }])], ngContentSelectors: _c2, decls: 4, vars: 2, consts: [[\"class\", \"mat-drawer-backdrop\", 3, \"mat-drawer-shown\", \"click\", 4, \"ngIf\"], [4, \"ngIf\"], [1, \"mat-drawer-backdrop\", 3, \"click\"]], template: function MatDrawerContainer_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef(_c1);\n        ɵngcc0.ɵɵtemplate(0, MatDrawerContainer_div_0_Template, 1, 2, \"div\", 0);\n        ɵngcc0.ɵɵprojection(1);\n        ɵngcc0.ɵɵprojection(2, 1);\n        ɵngcc0.ɵɵtemplate(3, MatDrawerContainer_mat_drawer_content_3_Template, 2, 0, \"mat-drawer-content\", 1);\n    } if (rf & 2) {\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx.hasBackdrop);\n        ɵngcc0.ɵɵadvance(3);\n        ɵngcc0.ɵɵproperty(\"ngIf\", !ctx._content);\n    } }, directives: [ɵngcc5.NgIf, MatDrawerContent], styles: [_c5], encapsulation: 2, changeDetection: 0 });\nMatDrawerContainer.ctorParameters = () => [\n    { type: Directionality, decorators: [{ type: Optional }] },\n    { type: ElementRef },\n    { type: NgZone },\n    { type: ChangeDetectorRef },\n    { type: ViewportRuler },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_DRAWER_DEFAULT_AUTOSIZE,] }] },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }\n];\nMatDrawerContainer.propDecorators = {\n    _allDrawers: [{ type: ContentChildren, args: [MatDrawer, {\n                    // We need to use `descendants: true`, because Ivy will no longer match\n                    // indirect descendants if it's left as false.\n                    descendants: true\n                },] }],\n    _content: [{ type: ContentChild, args: [MatDrawerContent,] }],\n    _userContent: [{ type: ViewChild, args: [MatDrawerContent,] }],\n    autosize: [{ type: Input }],\n    hasBackdrop: [{ type: Input }],\n    backdropClick: [{ type: Output }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDrawerContainer, [{\n        type: Component,\n        args: [{\n                selector: 'mat-drawer-container',\n                exportAs: 'matDrawerContainer',\n                template: \"<div class=\\\"mat-drawer-backdrop\\\" (click)=\\\"_onBackdropClicked()\\\" *ngIf=\\\"hasBackdrop\\\"\\n     [class.mat-drawer-shown]=\\\"_isShowingBackdrop()\\\"></div>\\n\\n<ng-content select=\\\"mat-drawer\\\"></ng-content>\\n\\n<ng-content select=\\\"mat-drawer-content\\\">\\n</ng-content>\\n<mat-drawer-content *ngIf=\\\"!_content\\\">\\n  <ng-content></ng-content>\\n</mat-drawer-content>\\n\",\n                host: {\n                    'class': 'mat-drawer-container',\n                    '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None,\n                providers: [{\n                        provide: MAT_DRAWER_CONTAINER,\n                        useExisting: MatDrawerContainer\n                    }],\n                styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\\n\"]\n            }]\n    }], function () { return [{ type: ɵngcc4.Directionality, decorators: [{\n                type: Optional\n            }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.NgZone }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.ViewportRuler }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_DRAWER_DEFAULT_AUTOSIZE]\n            }] }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }]; }, { backdropClick: [{\n            type: Output\n        }], autosize: [{\n            type: Input\n        }], hasBackdrop: [{\n            type: Input\n        }], _allDrawers: [{\n            type: ContentChildren,\n            args: [MatDrawer, {\n                    // We need to use `descendants: true`, because Ivy will no longer match\n                    // indirect descendants if it's left as false.\n                    descendants: true\n                }]\n        }], _content: [{\n            type: ContentChild,\n            args: [MatDrawerContent]\n        }], _userContent: [{\n            type: ViewChild,\n            args: [MatDrawerContent]\n        }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSidenavContent extends MatDrawerContent {\n    constructor(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone) {\n        super(changeDetectorRef, container, elementRef, scrollDispatcher, ngZone);\n    }\n}\nMatSidenavContent.ɵfac = function MatSidenavContent_Factory(t) { return new (t || MatSidenavContent)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(forwardRef(() => MatSidenavContainer)), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ScrollDispatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.NgZone)); };\nMatSidenavContent.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSidenavContent, selectors: [[\"mat-sidenav-content\"]], hostAttrs: [1, \"mat-drawer-content\", \"mat-sidenav-content\"], hostVars: 4, hostBindings: function MatSidenavContent_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵstyleProp(\"margin-left\", ctx._container._contentMargins.left, \"px\")(\"margin-right\", ctx._container._contentMargins.right, \"px\");\n    } }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 1, vars: 0, template: function MatSidenavContent_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵprojection(0);\n    } }, encapsulation: 2, changeDetection: 0 });\nMatSidenavContent.ctorParameters = () => [\n    { type: ChangeDetectorRef },\n    { type: MatSidenavContainer, decorators: [{ type: Inject, args: [forwardRef(() => MatSidenavContainer),] }] },\n    { type: ElementRef },\n    { type: ScrollDispatcher },\n    { type: NgZone }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenavContent, [{\n        type: Component,\n        args: [{\n                selector: 'mat-sidenav-content',\n                template: '<ng-content></ng-content>',\n                host: {\n                    'class': 'mat-drawer-content mat-sidenav-content',\n                    '[style.margin-left.px]': '_container._contentMargins.left',\n                    '[style.margin-right.px]': '_container._contentMargins.right'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None\n            }]\n    }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }, { type: MatSidenavContainer, decorators: [{\n                type: Inject,\n                args: [forwardRef(() => MatSidenavContainer)]\n            }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ScrollDispatcher }, { type: ɵngcc0.NgZone }]; }, null); })();\nclass MatSidenav extends MatDrawer {\n    constructor() {\n        super(...arguments);\n        this._fixedInViewport = false;\n        this._fixedTopGap = 0;\n        this._fixedBottomGap = 0;\n    }\n    /** Whether the sidenav is fixed in the viewport. */\n    get fixedInViewport() { return this._fixedInViewport; }\n    set fixedInViewport(value) { this._fixedInViewport = coerceBooleanProperty(value); }\n    /**\n     * The gap between the top of the sidenav and the top of the viewport when the sidenav is in fixed\n     * mode.\n     */\n    get fixedTopGap() { return this._fixedTopGap; }\n    set fixedTopGap(value) { this._fixedTopGap = coerceNumberProperty(value); }\n    /**\n     * The gap between the bottom of the sidenav and the bottom of the viewport when the sidenav is in\n     * fixed mode.\n     */\n    get fixedBottomGap() { return this._fixedBottomGap; }\n    set fixedBottomGap(value) { this._fixedBottomGap = coerceNumberProperty(value); }\n}\nMatSidenav.ɵfac = /*@__PURE__*/ function () { let ɵMatSidenav_BaseFactory; return function MatSidenav_Factory(t) { return (ɵMatSidenav_BaseFactory || (ɵMatSidenav_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatSidenav)))(t || MatSidenav); }; }();\nMatSidenav.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSidenav, selectors: [[\"mat-sidenav\"]], hostAttrs: [\"tabIndex\", \"-1\", 1, \"mat-drawer\", \"mat-sidenav\"], hostVars: 17, hostBindings: function MatSidenav_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"align\", null);\n        ɵngcc0.ɵɵstyleProp(\"top\", ctx.fixedInViewport ? ctx.fixedTopGap : null, \"px\")(\"bottom\", ctx.fixedInViewport ? ctx.fixedBottomGap : null, \"px\");\n        ɵngcc0.ɵɵclassProp(\"mat-drawer-end\", ctx.position === \"end\")(\"mat-drawer-over\", ctx.mode === \"over\")(\"mat-drawer-push\", ctx.mode === \"push\")(\"mat-drawer-side\", ctx.mode === \"side\")(\"mat-drawer-opened\", ctx.opened)(\"mat-sidenav-fixed\", ctx.fixedInViewport);\n    } }, inputs: { fixedInViewport: \"fixedInViewport\", fixedTopGap: \"fixedTopGap\", fixedBottomGap: \"fixedBottomGap\" }, exportAs: [\"matSidenav\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[\"cdkScrollable\", \"\", 1, \"mat-drawer-inner-container\"]], template: function MatSidenav_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef();\n        ɵngcc0.ɵɵelementStart(0, \"div\", 0);\n        ɵngcc0.ɵɵprojection(1);\n        ɵngcc0.ɵɵelementEnd();\n    } }, directives: [ɵngcc1.CdkScrollable], encapsulation: 2, data: { animation: [matDrawerAnimations.transformDrawer] }, changeDetection: 0 });\nMatSidenav.propDecorators = {\n    fixedInViewport: [{ type: Input }],\n    fixedTopGap: [{ type: Input }],\n    fixedBottomGap: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenav, [{\n        type: Component,\n        args: [{\n                selector: 'mat-sidenav',\n                exportAs: 'matSidenav',\n                template: \"<div class=\\\"mat-drawer-inner-container\\\" cdkScrollable>\\r\\n  <ng-content></ng-content>\\r\\n</div>\\r\\n\",\n                animations: [matDrawerAnimations.transformDrawer],\n                host: {\n                    'class': 'mat-drawer mat-sidenav',\n                    'tabIndex': '-1',\n                    // must prevent the browser from aligning text based on value\n                    '[attr.align]': 'null',\n                    '[class.mat-drawer-end]': 'position === \"end\"',\n                    '[class.mat-drawer-over]': 'mode === \"over\"',\n                    '[class.mat-drawer-push]': 'mode === \"push\"',\n                    '[class.mat-drawer-side]': 'mode === \"side\"',\n                    '[class.mat-drawer-opened]': 'opened',\n                    '[class.mat-sidenav-fixed]': 'fixedInViewport',\n                    '[style.top.px]': 'fixedInViewport ? fixedTopGap : null',\n                    '[style.bottom.px]': 'fixedInViewport ? fixedBottomGap : null'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None\n            }]\n    }], null, { fixedInViewport: [{\n            type: Input\n        }], fixedTopGap: [{\n            type: Input\n        }], fixedBottomGap: [{\n            type: Input\n        }] }); })();\nclass MatSidenavContainer extends MatDrawerContainer {\n}\nMatSidenavContainer.ɵfac = /*@__PURE__*/ function () { let ɵMatSidenavContainer_BaseFactory; return function MatSidenavContainer_Factory(t) { return (ɵMatSidenavContainer_BaseFactory || (ɵMatSidenavContainer_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatSidenavContainer)))(t || MatSidenavContainer); }; }();\nMatSidenavContainer.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSidenavContainer, selectors: [[\"mat-sidenav-container\"]], contentQueries: function MatSidenavContainer_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatSidenavContent, 5);\n        ɵngcc0.ɵɵcontentQuery(dirIndex, MatSidenav, 5);\n    } if (rf & 2) {\n        let _t;\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._content = _t.first);\n        ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._allDrawers = _t);\n    } }, hostAttrs: [1, \"mat-drawer-container\", \"mat-sidenav-container\"], hostVars: 2, hostBindings: function MatSidenavContainer_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵclassProp(\"mat-drawer-container-explicit-backdrop\", ctx._backdropOverride);\n    } }, exportAs: [\"matSidenavContainer\"], features: [ɵngcc0.ɵɵProvidersFeature([{\n                provide: MAT_DRAWER_CONTAINER,\n                useExisting: MatSidenavContainer\n            }]), ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c4, decls: 4, vars: 2, consts: [[\"class\", \"mat-drawer-backdrop\", 3, \"mat-drawer-shown\", \"click\", 4, \"ngIf\"], [\"cdkScrollable\", \"\", 4, \"ngIf\"], [1, \"mat-drawer-backdrop\", 3, \"click\"], [\"cdkScrollable\", \"\"]], template: function MatSidenavContainer_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵprojectionDef(_c3);\n        ɵngcc0.ɵɵtemplate(0, MatSidenavContainer_div_0_Template, 1, 2, \"div\", 0);\n        ɵngcc0.ɵɵprojection(1);\n        ɵngcc0.ɵɵprojection(2, 1);\n        ɵngcc0.ɵɵtemplate(3, MatSidenavContainer_mat_sidenav_content_3_Template, 2, 0, \"mat-sidenav-content\", 1);\n    } if (rf & 2) {\n        ɵngcc0.ɵɵproperty(\"ngIf\", ctx.hasBackdrop);\n        ɵngcc0.ɵɵadvance(3);\n        ɵngcc0.ɵɵproperty(\"ngIf\", !ctx._content);\n    } }, directives: [ɵngcc5.NgIf, MatSidenavContent, ɵngcc1.CdkScrollable], styles: [_c5], encapsulation: 2, changeDetection: 0 });\nMatSidenavContainer.propDecorators = {\n    _allDrawers: [{ type: ContentChildren, args: [MatSidenav, {\n                    // We need to use `descendants: true`, because Ivy will no longer match\n                    // indirect descendants if it's left as false.\n                    descendants: true\n                },] }],\n    _content: [{ type: ContentChild, args: [MatSidenavContent,] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenavContainer, [{\n        type: Component,\n        args: [{\n                selector: 'mat-sidenav-container',\n                exportAs: 'matSidenavContainer',\n                template: \"<div class=\\\"mat-drawer-backdrop\\\" (click)=\\\"_onBackdropClicked()\\\" *ngIf=\\\"hasBackdrop\\\"\\n     [class.mat-drawer-shown]=\\\"_isShowingBackdrop()\\\"></div>\\n\\n<ng-content select=\\\"mat-sidenav\\\"></ng-content>\\n\\n<ng-content select=\\\"mat-sidenav-content\\\">\\n</ng-content>\\n<mat-sidenav-content *ngIf=\\\"!_content\\\" cdkScrollable>\\n  <ng-content></ng-content>\\n</mat-sidenav-content>\\n\",\n                host: {\n                    'class': 'mat-drawer-container mat-sidenav-container',\n                    '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride'\n                },\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None,\n                providers: [{\n                        provide: MAT_DRAWER_CONTAINER,\n                        useExisting: MatSidenavContainer\n                    }],\n                styles: [\".mat-drawer-container{position:relative;z-index:1;box-sizing:border-box;-webkit-overflow-scrolling:touch;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}.cdk-high-contrast-active .mat-drawer-backdrop{opacity:.5}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}.cdk-high-contrast-active .mat-drawer,.cdk-high-contrast-active [dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}.cdk-high-contrast-active [dir=rtl] .mat-drawer,.cdk-high-contrast-active .mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer{transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch}.mat-sidenav-fixed{position:fixed}\\n\"]\n            }]\n    }], null, { _allDrawers: [{\n            type: ContentChildren,\n            args: [MatSidenav, {\n                    // We need to use `descendants: true`, because Ivy will no longer match\n                    // indirect descendants if it's left as false.\n                    descendants: true\n                }]\n        }], _content: [{\n            type: ContentChild,\n            args: [MatSidenavContent]\n        }] }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatSidenavModule {\n}\nMatSidenavModule.ɵfac = function MatSidenavModule_Factory(t) { return new (t || MatSidenavModule)(); };\nMatSidenavModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatSidenavModule });\nMatSidenavModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[\n            CommonModule,\n            MatCommonModule,\n            PlatformModule,\n            CdkScrollableModule,\n        ], CdkScrollableModule,\n        MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSidenavModule, [{\n        type: NgModule,\n        args: [{\n                imports: [\n                    CommonModule,\n                    MatCommonModule,\n                    PlatformModule,\n                    CdkScrollableModule,\n                ],\n                exports: [\n                    CdkScrollableModule,\n                    MatCommonModule,\n                    MatDrawer,\n                    MatDrawerContainer,\n                    MatDrawerContent,\n                    MatSidenav,\n                    MatSidenavContainer,\n                    MatSidenavContent,\n                ],\n                declarations: [\n                    MatDrawer,\n                    MatDrawerContainer,\n                    MatDrawerContent,\n                    MatSidenav,\n                    MatSidenavContainer,\n                    MatSidenavContent,\n                ]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatSidenavModule, { declarations: function () { return [MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent]; }, imports: function () { return [CommonModule,\n        MatCommonModule,\n        PlatformModule,\n        CdkScrollableModule]; }, exports: function () { return [CdkScrollableModule,\n        MatCommonModule, MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_DRAWER_DEFAULT_AUTOSIZE, MAT_DRAWER_DEFAULT_AUTOSIZE_FACTORY, MatDrawer, MatDrawerContainer, MatDrawerContent, MatSidenav, MatSidenavContainer, MatSidenavContent, MatSidenavModule, matDrawerAnimations, throwMatDuplicatedDrawerError, MAT_DRAWER_CONTAINER as ɵangular_material_src_material_sidenav_sidenav_a };\n\n//# sourceMappingURL=sidenav.js.map","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Inject } from '@angular/core';\nimport { Modal } from '@common/core/ui/dialogs/modal.service';\nimport { CrupdateFolderDialogComponent } from '../../folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\nimport { Select, Store } from '@ngxs/store';\nimport { UploadFiles } from '../../state/actions/commands';\nimport { UploadedFile } from '@common/uploads/uploaded-file';\nimport { UploadInputConfig } from '@common/uploads/upload-input-config';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DRIVE_UPLOAD_INPUT_CONFIG } from '../../upload-input-config';\n\n@Component({\n    selector: 'sidebar-action-buttons',\n    templateUrl: './sidebar-action-buttons.component.html',\n    styleUrls: ['./sidebar-action-buttons.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SidebarActionButtonsComponent {\n    @Select(DriveState.canUpload) canUpload$: Observable<boolean>;\n\n    constructor(\n        private dialog: Modal,\n        private store: Store,\n        @Inject(DRIVE_UPLOAD_INPUT_CONFIG) public uploadInputConfig: UploadInputConfig,\n    ) {}\n\n    public openNewFolderDialog() {\n        this.dialog.open(CrupdateFolderDialogComponent);\n    }\n\n    public openUploadsPanel(files: UploadedFile[]) {\n        this.store.dispatch(new UploadFiles(files));\n    }\n}\n","<button\n    mat-raised-button\n    color=\"accent\"\n    class=\"upload-button\"\n    [disabled]=\"!(canUpload$ | async)\"\n    [uploadButton]=\"uploadInputConfig\"\n    (filesSelected)=\"openUploadsPanel($event)\"\n>\n    <mat-icon svgIcon=\"cloud-upload\"></mat-icon>\n    <span trans>Upload</span>\n</button>\n\n<button\n    mat-raised-button\n    color=\"accent\"\n    class=\"new-folder-button\"\n    [disabled]=\"!(canUpload$ | async)\"\n    (click)=\"openNewFolderDialog()\"\n>\n    <mat-icon svgIcon=\"create-new-folder\"></mat-icon>\n</button>\n","<mat-progress-bar mode=\"determinate\" color=\"accent\" [value]=\"spaceUsedPercent$ | async\"></mat-progress-bar>\n\n<div class=\"usage-info\" *ngIf=\"(spaceUsed$ | async) !== null; else skeleton\" @fadeIn>\n    {{spaceUsed$ | async | formattedFileSize}} {{'of' | trans}} {{spaceAvailable$ | async | formattedFileSize }} {{'used' | trans}}\n</div>\n<ng-template #skeleton>\n    <skeleton class=\"usage-info\" @fadeOut></skeleton>\n</ng-template>\n\n\n<div *ngIf=\"settings.get('billing.enable') && (!(workspaces.activeId$ | async) || (workspaces.activeWorkspace$ | async)?.currentUser?.is_owner)\">\n    <a class=\"upgrade-link\" mat-button routerLink=\"/billing/upgrade\" target=\"_blank\" trans>Upgrade Storage</a>\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { Select } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { Settings } from '@common/core/config/settings.service';\nimport { SKELETON_ANIMATIONS } from '../../../../common/core/ui/skeleton/skeleton-animations';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\n\n@Component({\n    selector: 'available-space-indicator',\n    templateUrl: './available-space-indicator.component.html',\n    styleUrls: ['./available-space-indicator.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: [SKELETON_ANIMATIONS],\n})\nexport class AvailableSpaceIndicatorComponent {\n    @Select(DriveState.userSpaceUsed) spaceUsed$: Observable<number>;\n    @Select(DriveState.userSpaceAvailable) spaceAvailable$: Observable<number>;\n    @Select(DriveState.spaceUsedPercent) spaceUsedPercent$: Observable<number>;\n\n    constructor(public settings: Settings, public workspaces: WorkspacesService) {}\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","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { DriveUrlsService } from '../drive-urls.service';\nimport { DriveState } from '../state/drive-state';\nimport { Select, Store } from '@ngxs/store';\nimport { Observable } from 'rxjs';\nimport { OpenFolder } from '../state/actions/commands';\nimport { DrivePage } from '../state/models/drive-page';\nimport { DriveFolder } from '../folders/models/driveFolder';\n\n@Component({\n    selector: 'sidebar',\n    templateUrl: './sidebar.component.html',\n    styleUrls: ['./sidebar.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SidebarComponent {\n    @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n    @Select(DriveState.rootFolder) rootFolder$: Observable<DriveFolder>;\n\n    constructor(\n        public urls: DriveUrlsService,\n        private store: Store\n    ) {}\n\n    public openFolder(folder: DriveFolder) {\n        this.store.dispatch(new OpenFolder(folder));\n    }\n}\n","<div class=\"sidebar-body\">\n    <sidebar-action-buttons></sidebar-action-buttons>\n\n    <div class=\"drive-folders\">\n        <div class=\"sidebar-menu-item\" [routerLink]=\"urls.driveRoot()\" routerLinkActive=\"active\" [routerLinkActiveOptions]=\"{exact: true}\" [folderDropTarget]=\"rootFolder$ | async\">\n            <mat-icon svgIcon=\"arrow-drop-down\" class=\"toggle-expansion-icon\" [class.expanded]=\"driveTree.expanded\" (click)=\"driveTree.toggle(); $event.stopPropagation()\"></mat-icon>\n            <mat-icon svgIcon=\"network-drive-custom\"></mat-icon>\n            <span class=\"text\" trans>All Files</span>\n        </div>\n        <folders-tree (folderSelected)=\"openFolder($event)\" #driveTree></folders-tree>\n    </div>\n\n    <custom-menu class=\"sidebar-menu\" position=\"drive-sidebar\" itemClass=\"sidebar-menu-item\"></custom-menu>\n\n    <div class=\"usage-container\">\n        <mat-icon svgIcon=\"storage\"></mat-icon>\n        <available-space-indicator></available-space-indicator>\n    </div>\n</div>\n\n<div class=\"sidebar-footer\">\n    <workspace-selector></workspace-selector>\n</div>\n\n\n","<ng-container *ngIf=\"entry$ | async as entry\">\n    <ng-container *ngIf=\"savingDescription$ | async; else descriptionSaved\">\n        <span trans>Saving...</span>\n    </ng-container>\n    <ng-template #descriptionSaved>\n        <div class=\"input-container\" *ngIf=\"editingDescription$ | async; else descriptionEl\">\n            <label for=\"description\" class=\"hidden\" trans>Description</label>\n            <textarea\n                    rows=\"4\"\n                    id=\"description\"\n                    #textArea\n                    [value]=\"entry.description\"\n                    (enterKeybind)=\"textArea.blur()\"\n                    (blur)=\"updateDescription(entry, textArea.value)\"\n            ></textarea>\n        </div>\n        <ng-template #descriptionEl>\n            <div class=\"description-text\" (click)=\"editDescription()\">{{entry.description || ('Add a description' | trans)}}</div>\n            <button mat-icon-button (click)=\"editDescription()\" [matTooltip]=\"'Edit description' | trans\">\n                <mat-icon svgIcon=\"edit\"></mat-icon>\n            </button>\n        </ng-template>\n    </ng-template>\n</ng-container>","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, QueryList, ViewChildren, ViewEncapsulation } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { UpdateEntryDescription } from '../../../state/actions/commands';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../../state/drive-state';\nimport { DriveEntry } from '../../../files/models/drive-entry';\nimport { finalize } from 'rxjs/operators';\n\n@Component({\n    selector: 'entry-description-panel',\n    templateUrl: './entry-description-panel.component.html',\n    styleUrls: ['./entry-description-panel.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntryDescriptionPanelComponent implements AfterViewInit {\n    @Select(DriveState.selectedEntryOrActiveFolder) entry$: Observable<DriveEntry>;\n    @ViewChildren('textArea') textArea: QueryList<ElementRef<HTMLTextAreaElement>>;\n    public editingDescription$ = new BehaviorSubject(false);\n    public savingDescription$ = new BehaviorSubject(false);\n\n    constructor(private store: Store) {}\n\n    public ngAfterViewInit() {\n        this.textArea.changes.subscribe(queryList => {\n            queryList.length && queryList.first.nativeElement.focus();\n        });\n    }\n\n    public editDescription() {\n        this.editingDescription$.next(true);\n    }\n\n    public updateDescription(entry: FileEntry, value: string) {\n        this.editingDescription$.next(false);\n        if (entry.description === value) return;\n        this.savingDescription$.next(true);\n        this.store.dispatch(new UpdateEntryDescription(entry, value))\n            .pipe(finalize(() => this.savingDescription$.next(false)))\n            .subscribe();\n    }\n}\n","<img [src]=\"getPreviewUrl()\"\n     *ngIf=\"file.type === 'image'\"\n     [ngClass]=\"file.type+'-file'\"\n     class=\"file-color\"\n     draggable=\"false\">\n\n<file-icon *ngIf=\"file.type !== 'image'\" [type]=\"file.type === 'folder' ? getFolderIcon() : file.type\"></file-icon>","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { DriveEntry } from '../../models/drive-entry';\n\n@Component({\n    selector: 'file-thumbnail',\n    templateUrl: './file-thumbnail.component.html',\n    styleUrls: ['./file-thumbnail.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FileThumbnailComponent {\n    @Input() file: DriveEntry;\n\n    public getPreviewUrl(): string {\n        let url = this.file.url;\n        if (this.file.thumbnail) {\n            const separator = url.includes('?') ? '&' : '?';\n            url += separator + 'thumbnail=true';\n        }\n        return url;\n    }\n\n    public getFolderIcon() {\n        if (this.file.users && this.file.users.length > 1) {\n            return 'shared-folder';\n        } else {\n            return 'folder';\n        }\n    }\n}\n","<ng-container *ngIf=\"entry$ | async as entry; else nothingSelected\">\n    <ng-container *ngIf=\"entry.updated_at; else nothingSelected\">\n        <file-thumbnail *ngIf=\"entry.type === 'image'\" class=\"preview\" [file]=\"entry\"></file-thumbnail>\n        <div class=\"users-list\">\n            <mat-icon class=\"users-list-img workspace-img\" svgIcon=\"groups\" *ngIf=\"entry.workspace_id\" [matTooltip]=\"'Everyone at :workspace workspace' | trans:{workspace: (workspaces.activeWorkspace$ | async)?.name}\"></mat-icon>\n            <img class=\"users-list-img\" *ngFor=\"let user of entry.users\" [src]=\"user.avatar\" [matTooltip]=\"user.display_name\">\n        </div>\n        <div class=\"details-list\">\n            <div class=\"item\">\n                <div class=\"name\" trans>Type</div>\n                <div class=\"value type-value\">{{entry.type | trans}}</div>\n            </div>\n            <div class=\"item\">\n                <div class=\"name\" trans>Size</div>\n                <div class=\"value\">{{entry.file_size | formattedFileSize}}</div>\n            </div>\n            <div class=\"item\">\n                <div class=\"name\" trans>Storage Used</div>\n                <div class=\"value\">{{entry.file_size | formattedFileSize}}</div>\n            </div>\n            <div class=\"item location-item\">\n                <div class=\"name\" trans>Location</div>\n                <div class=\"value\" (click)=\"openLocation()\">\n                    <mat-icon svgIcon=\"folder\"></mat-icon>\n                    <span class=\"text\">{{(parent$ | async)?.name || ('All Files') | trans}}</span>\n                </div>\n            </div>\n            <div class=\"item\" *ngIf=\"owner$ | async as owner\">\n                <div class=\"name\" trans>Owner</div>\n                <div class=\"value\">{{owner.display_name}}</div>\n            </div>\n            <div class=\"item\">\n                <div class=\"name\" trans>Last Updated</div>\n                <div class=\"value\">{{entry.updated_at | formattedDate}}</div>\n            </div>\n            <div class=\"item\">\n                <div class=\"name\" trans>Created</div>\n                <div class=\"value\">{{entry.created_at | formattedDate}}</div>\n            </div>\n            <entry-description-panel></entry-description-panel>\n        </div>\n    </ng-container>\n</ng-container>\n\n<ng-template #nothingSelected>\n    <div class=\"nothing-selected\">\n        <mat-icon svgIcon=\"selection-tool-custom\" class=\"icon\"></mat-icon>\n        <div class=\"text\" trans>Select file or folder to view its details.</div>\n    </div>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { OpenFolder } from '../../state/actions/commands';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\nimport { map } from 'rxjs/operators';\n\n@Component({\n    selector: 'details-panel',\n    templateUrl: './details-panel.component.html',\n    styleUrls: ['./details-panel.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DetailsPanelComponent {\n    @Select(DriveState.selectedEntryOrActiveFolder) entry$: Observable<DriveEntry>;\n    @Select(DriveState.selectedEntryParent) parent$: Observable<DriveFolder>;\n    public owner$ = this.store.select(DriveState.selectedEntryOrActiveFolder)\n        .pipe(map(e => (e?.users || []).find(u => u.owns_entry)));\n\n    constructor(\n        private store: Store,\n        public workspaces: WorkspacesService,\n    ) {}\n\n    public openLocation() {\n        const parent = this.store.selectSnapshot(DriveState.selectedEntryParent);\n        this.store.dispatch(new OpenFolder(parent));\n    }\n}\n","<div class=\"header\">\n    <div class=\"title\">\n        <ng-container *ngIf=\"entry$ | async as entry; else defaultTitle\">\n            <ng-container *ngIf=\"entry.type; else defaultTitle\">\n                <file-icon [type]=\"entry.type\"></file-icon>\n                <div class=\"name\">{{entry.name}}</div>\n            </ng-container>\n        </ng-container>\n        <ng-template #defaultTitle>\n            <file-icon type=\"folder\"></file-icon>\n            <div class=\"name\">{{ ((activePage$ | async)?.viewName) | trans }}</div>\n        </ng-template>\n        <button mat-icon-button class=\"close-button\" (click)=\"close()\">\n            <mat-icon svgIcon=\"close\"></mat-icon>\n        </button>\n    </div>\n</div>\n<details-panel></details-panel>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState} from '../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { DriveEntry } from '../files/models/drive-entry';\nimport { ToggleDetailsSidebar } from '../state/actions/commands';\nimport { DrivePage } from '../state/models/drive-page';\n\n@Component({\n    selector: 'details-sidebar',\n    templateUrl: './details-sidebar.component.html',\n    styleUrls: ['./details-sidebar.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DetailsSidebarComponent {\n    @Select(DriveState.selectedEntryOrActiveFolder) entry$: Observable<DriveEntry>;\n    @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n\n    constructor(private store: Store) {}\n\n    public close() {\n        this.store.dispatch(new ToggleDetailsSidebar());\n    }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, HostBinding } from '@angular/core';\nimport { DriveEntry } from '../../../models/drive-entry';\n\n@Component({\n    selector: 'files-grid-item',\n    templateUrl: './files-grid-item.component.html',\n    styleUrls: ['./files-grid-item.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilesGridItemComponent {\n    @HostBinding('class.drive-entry') driveEntry = true;\n    @Input() entry: DriveEntry;\n\n    @HostBinding('attr.data-id') get fileId() {\n        return this.entry.id;\n    }\n}\n","<div class=\"preview-container\">\n    <file-thumbnail class=\"preview\" [file]=\"entry\"></file-thumbnail>\n</div>\n<figcaption class=\"files-grid-item-footer\">\n    <file-icon [type]=\"entry.type\"></file-icon>\n    <div class=\"text\">{{entry.name}}</div>\n</figcaption>\n","import { Injectable } from '@angular/core';\nimport { EntriesSelectedViaDrag } from '../state/actions/events';\nimport { Store } from '@ngxs/store';\nimport { DriveDomCacheService } from './drive-dom-cache.service';\nimport { DriveState } from '../state/drive-state';\n\nconst GRID_ITEM_SELECTOR = '.drive-entry';\n\ntype AreaEdge = 'top'|'left'|'right'|'bottom'|false;\n\ninterface SelectorRect extends ClientRect {\n    height: number;\n    width: number;\n}\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class FilesDragSelectService {\n    private selectBox: HTMLDivElement;\n    private initial = {x: 0, y: 0, scrollTop: 0};\n    private lastPanEvent: HammerInput|null;\n    private scrollListener: EventListener;\n    private gridElements: HTMLElement[];\n\n    constructor(\n        private store: Store,\n        private cache: DriveDomCacheService,\n    ) {}\n\n    public start(e: HammerInput) {\n        this.cacheClientRects();\n        this.createSelectBox();\n        this.bindScroll();\n        this.gridElements = this.getGridElements();\n\n        this.initial = {\n            ...this.hammerToRelative(e),\n            scrollTop: this.cache.scrollCont.scrollTop,\n        };\n\n        this.selectBox.style.top = this.initial.y + 'px';\n        this.selectBox.style.left = this.initial.x + 'px';\n\n\n    }\n\n    public move(e: HammerInput) {\n        this.lastPanEvent = e;\n        this.resizeBox(e);\n    }\n\n    public end() {\n        this.removeSelectBox();\n        this.dispatchSelectedAction();\n        this.unbindScroll();\n        this.gridElements = [];\n    }\n\n    public resizeBox(e?: HammerInput|null) {\n        if ( ! e) e = this.lastPanEvent;\n        if ( ! e || ! this.selectBox) return;\n        const newPos = this.getNewSelectorPosition(e);\n        this.scrollAndRepositionSelector(newPos);\n        this.selectIntersectingElements();\n    }\n\n    /**\n     * Calculate new position of selector box.\n     */\n    private getNewSelectorPosition(e: HammerInput): SelectorRect {\n        const current = this.hammerToRelative(e);\n\n        let tmp,\n            x1 = this.initial.x,\n            y1 = this.initial.y,\n            x2 = current.x,\n            y2 = current.y;\n\n        if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }\n        if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }\n\n        return {\n            width: x2 - x1,\n            height: y2 - y1,\n            top: y1,\n            right: x1 + (x2 - x1), // left + width\n            bottom: y1 + (y2 - y1), // top + height\n            left: x1,\n        };\n    }\n\n    /**\n     * Check if specified position intersects any container edge.\n     */\n    private reachedAreaEdge(newPos: ClientRect): AreaEdge {\n        const area = this.rectToRelative(this.cache.filesContRect);\n\n        if (newPos.left <= area.left) {\n            return 'left';\n        } else if (newPos.top <= area.top) {\n            return 'top';\n        } else if (newPos.right >= area.right) {\n            return 'right';\n        } else if (newPos.bottom >= area.bottom) {\n            return 'bottom';\n        }\n\n        return false;\n    }\n\n    /**\n     * Auto scroll container (if needed) and reposition selector box.\n     */\n    private scrollAndRepositionSelector(newPos: SelectorRect) {\n        const area = this.cache.scrollCont,\n            edge = this.reachedAreaEdge(newPos);\n\n        // make sure top always starts at the same coordinates\n        // regardless of any scrolling done during dragging\n        newPos.top += this.initial.scrollTop;\n\n        // auto scroll when cursor reaches container edge\n        if (edge === 'bottom') {\n            area.scrollBy({top: 4});\n        } else if (edge === 'top') {\n            area.scrollBy({top: -4});\n        }\n\n        // scroll diff between drag start and now (auto scroll or mouse wheel)\n        const scrollDiff = this.cache.scrollCont.scrollTop - this.initial.scrollTop,\n            scrollValue = Math.abs(scrollDiff);\n\n        // top needs to be changed only if scroll direction is top\n        if (scrollDiff < 0) {\n            newPos.top -= scrollValue;\n        }\n\n        // height needs to be changed regardless of direction and method\n        newPos.height += scrollValue;\n\n        // check if we have reached bottom edge again, after scroll values are applied\n        const reachedBottom = (newPos.top + newPos.height) >= this.cache.scrollCont.scrollHeight;\n\n        // if any select area edge is reached, bail\n        if (edge === 'left' || edge === 'right' || reachedBottom) return;\n\n        // finally, reposition select box with scroll values applied\n        this.applyPosition(newPos);\n    }\n\n    /**\n     * Apply specified position to selector box.\n     */\n    private applyPosition(newPos: ClientRect) {\n        this.selectBox.style.width = newPos.width + 'px';\n        this.selectBox.style.height = newPos.height + 'px';\n        this.selectBox.style.left = newPos.left + 'px';\n        this.selectBox.style.top = newPos.top + 'px';\n    }\n\n    private selectIntersectingElements() {\n        const selectedBoxRect = this.selectBox.getBoundingClientRect();\n        this.gridElements.forEach((gridItem: HTMLElement) => {\n            const rect = gridItem.getBoundingClientRect();\n\n            // item intersects the select box\n            if (rect.top + rect.height > selectedBoxRect.top\n                && rect.left + rect.width > selectedBoxRect.left\n                && rect.bottom - rect.height < selectedBoxRect.bottom\n                && rect.right - rect.width < selectedBoxRect.right) {\n                gridItem.classList.add('selected');\n            } else {\n                gridItem.classList.remove('selected');\n            }\n        });\n    }\n\n    /**\n     * Transform absolute container client rect into relative.\n     */\n    private rectToRelative(rect: ClientRect): ClientRect {\n        return {\n            width: rect.width,\n            height: rect.height,\n            left: rect.left - this.cache.filesContRect.left,\n            top: rect.top - this.cache.filesContRect.top,\n            right: rect.right - this.cache.filesContRect.left,\n            bottom: rect.bottom - this.cache.filesContRect.top\n        };\n    }\n\n    /**\n     * Transform hammer absolute event to relative coordinates.\n     */\n    private hammerToRelative(e: HammerInput) {\n        return {\n            x: e.center.x - this.cache.filesContRect.left,\n            y: e.center.y - this.cache.filesContRect.top\n        };\n    }\n\n    private dispatchSelectedAction() {\n        const ids = this.gridElements\n            .filter(el => el.classList.contains('selected'))\n            .map(el => +el.dataset.id);\n\n        const entries = this.store.selectSnapshot(DriveState.entries)\n            .filter(entry => ids.indexOf(entry.id) > -1);\n\n        this.store.dispatch(new EntriesSelectedViaDrag(entries));\n    }\n\n    private createSelectBox() {\n        this.selectBox = document.createElement('div');\n        this.selectBox.classList.add('files-select-box');\n        this.cache.filesCont.appendChild(this.selectBox);\n    }\n\n    public removeSelectBox() {\n        if ( ! this.selectBox) return;\n        this.selectBox.remove();\n        this.selectBox = null;\n    }\n\n    public dragging() {\n        return !!this.selectBox;\n    }\n\n    private cacheClientRects() {\n        this.cache.filesContRect = this.cache.filesCont.getBoundingClientRect();\n        this.cache.scrollContRect = this.cache.scrollCont.getBoundingClientRect();\n    }\n\n    private getGridElements(): HTMLElement[] {\n        return Array.from(this.cache.filesCont.querySelectorAll(GRID_ITEM_SELECTOR));\n    }\n\n    private bindScroll() {\n        this.scrollListener = () => this.resizeBox();\n        this.cache.scrollCont.addEventListener('scroll', this.scrollListener);\n    }\n\n    private unbindScroll() {\n        this.cache.scrollCont.removeEventListener('scroll', this.scrollListener);\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { DriveDomCacheService } from './drive-dom-cache.service';\nimport { Store } from '@ngxs/store';\nimport { StoppedDragging } from '../state/actions/events';\nimport { StartedDragging } from '../state/actions/events';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class DragEntryService {\n    constructor(\n        private domCache: DriveDomCacheService,\n        private store: Store\n    ) {}\n\n    public start(e: HammerInput) {\n        this.store.dispatch(new StartedDragging());\n    }\n\n    public move(e: HammerInput) {\n        this.domCache.dragPreview.style.top = e.center.y + 'px';\n        this.domCache.dragPreview.style.left = e.center.x + 'px';\n    }\n\n    public end() {\n        this.store.dispatch(new StoppedDragging());\n    }\n}\n","import {\n    ContentChildren, Directive, ElementRef, NgZone, OnDestroy, OnInit, QueryList\n} from '@angular/core';\nimport { FilesGridItemComponent } from '../files/components/files-grid/files-grid-item/files-grid-item.component';\nimport { Store } from '@ngxs/store';\nimport { EntryDoubleTapped, EntryTapped } from '../state/actions/events';\nimport { DragEntryService } from './drag-entry.service';\nimport { DeselectAllEntries, SelectEntries } from '../state/actions/commands';\nimport { DriveState } from '../state/drive-state';\nimport { DriveEntry } from '../files/models/drive-entry';\nimport { FilesDragSelectService } from './files-drag-select.service';\nimport { DriveDomCacheService } from './drive-dom-cache.service';\nimport { Subscription } from 'rxjs';\n\n@Directive({\n    selector: '[driveHammerInteractions]'\n})\nexport class DriveHammerInteractionsDirective implements OnInit, OnDestroy {\n    @ContentChildren(FilesGridItemComponent, {descendants: true}) gridItems: QueryList<FilesGridItemComponent>;\n\n    private hammerManager: HammerManager;\n    private panService: FilesDragSelectService|DragEntryService|null;\n    private subscriptions: Subscription[] = [];\n\n    constructor(\n        private zone: NgZone,\n        private el: ElementRef,\n        private store: Store,\n        private dragSelect: FilesDragSelectService,\n        private dragEntry: DragEntryService,\n        private domCache: DriveDomCacheService,\n    ) {}\n\n    ngOnInit() {\n        this.bindToHammer();\n\n        // disable \"pan\" on mobile as it will prevent scrolling\n        const sub = this.store.select(DriveState.isMobile).subscribe(isMobile => {\n            this.hammerManager.get('pan').set({\n                enable: !isMobile\n            });\n            this.hammerManager.get('doubletap').set({\n                enable: !isMobile\n            });\n        });\n\n        this.subscriptions.push(sub);\n    }\n\n    ngOnDestroy() {\n        this.dragSelect.removeSelectBox();\n        this.subscriptions.forEach(sub => sub.unsubscribe());\n    }\n\n    private bindToHammer() {\n        this.createHammerManager();\n        this.onPanStart();\n        this.onPan();\n        this.onPanEnd();\n        this.onTap();\n        this.onDoubleTap();\n    }\n\n    private createHammerManager() {\n        this.zone.runOutsideAngular(() => {\n            this.hammerManager = new Hammer.Manager(this.domCache.filesCont);\n\n            const tap = new Hammer.Tap(),\n                pan = new Hammer.Pan(),\n                doubleTap = new Hammer.Tap({ event: 'doubletap', taps: 2 });\n\n            this.hammerManager.add([tap, doubleTap, pan]);\n            this.hammerManager.get('doubletap').recognizeWith('tap');\n        });\n    }\n\n    private onPanStart() {\n        this.hammerManager.on('panstart', e => {\n            const gridElement = this.getEntryEl(e);\n\n            if (gridElement) {\n                this.panService = this.dragEntry;\n                const entry = this.getEntryByEl(gridElement),\n                    selectedEntries = this.store.selectSnapshot(DriveState.selectedEntries);\n\n                // select entry, if not already selected\n                if ( ! selectedEntries.find(en => en.id === entry.id)) {\n                    this.store.dispatch(new SelectEntries([this.getEntryByEl(gridElement)]));\n                }\n            } else {\n                this.panService = this.dragSelect;\n            }\n\n            this.panService.start(e);\n        });\n    }\n\n    private onPan() {\n        this.hammerManager.on('pan', e => {\n            if (this.panService) this.panService.move(e);\n        });\n    }\n\n    private onPanEnd() {\n        this.hammerManager.on('panend', () => {\n            if (this.panService) this.panService.end();\n        });\n    }\n\n    private onTap() {\n        this.hammerManager.on('tap', e => {\n            const entryEl = this.getEntryEl(e);\n            this.dragSelect.removeSelectBox();\n\n            if (entryEl) {\n                this.store.dispatch(new EntryTapped(this.getEntryByEl(entryEl), e.srcEvent.ctrlKey || e.srcEvent.metaKey));\n            } else if (e.target.closest('.files-container')) {\n                this.store.dispatch(new DeselectAllEntries());\n            }\n        });\n    }\n\n    private onDoubleTap() {\n        this.hammerManager.on('doubletap', e => {\n            const gridElement = this.getEntryEl(e);\n            if ( ! gridElement) return;\n\n            this.store.dispatch(new EntryDoubleTapped(\n                this.getEntryByEl(gridElement)\n            ));\n        });\n    }\n\n    private getEntryEl(e: HammerInput) {\n        return e.target.closest('.drive-entry') as HTMLElement;\n    }\n\n    private getEntryByEl(el: HTMLElement): DriveEntry {\n        const id = +el.dataset.id;\n        return this.store.selectSnapshot(DriveState.entries)\n            .find(curr => curr.id === +id);\n    }\n}\n","import { AfterViewInit, Directive, ElementRef } from '@angular/core';\nimport { Select } from '@ngxs/store';\nimport { DriveState } from '../state/drive-state';\nimport { Observable } from 'rxjs';\n\n@Directive({\n    selector: '[toggleSelectedClass]'\n})\nexport class ToggleSelectedClassDirective implements AfterViewInit {\n    @Select(DriveState.selectedEntryIds) selectedEntryIds: Observable<number[]>;\n\n    constructor(private el: ElementRef) {}\n\n    ngAfterViewInit() {\n        this.selectedEntryIds.subscribe(ids => {\n            const els = this.el.nativeElement.querySelectorAll('.drive-entry');\n            if ( ! els.length) return;\n\n            Array.from(els).forEach((el: HTMLElement) => {\n                const selected = ids.indexOf(parseInt(el.dataset.id, 10)) > -1;\n\n                if (selected) {\n                    el.classList.add('selected');\n                } else {\n                    el.classList.remove('selected');\n                }\n            });\n        });\n    }\n}\n","import { UploadedFile } from '../uploaded-file';\n\nexport async function readUploadedFolders(entries: WebKitEntry[]): Promise<UploadedFile[]> {\n    let files = [];\n\n    for (const key in entries) {\n        const entry = entries[key];\n\n        if ( ! entry.isDirectory) {\n            files.push(await transformFileEntry(entry as WebKitFileEntry));\n        } else {\n            files = files.concat(await readDirRecursive(entry as WebKitDirectoryEntry));\n        }\n    }\n\n    return files;\n}\n\nasync function readDirRecursive(entry: WebKitDirectoryEntry, files = []) {\n    const entries = await readEntries(entry);\n\n    for (const key in entries) {\n        const childEntry = entries[key];\n\n        if (childEntry.isDirectory) {\n            await readDirRecursive(childEntry as WebKitDirectoryEntry, files);\n        } else {\n            files.push(await transformFileEntry(childEntry as WebKitFileEntry));\n        }\n    }\n\n    return files;\n}\n\nfunction readEntries(dir: WebKitDirectoryEntry): Promise<WebKitEntry[]> {\n    return new Promise(resolve => {\n       readEntriesRecursive(dir.createReader(), resolve);\n    });\n}\n\nfunction readEntriesRecursive(reader: WebKitDirectoryReader, resolve, allEntries: WebKitEntry[] = []) {\n    reader.readEntries(entries => {\n        if (entries.length) {\n            allEntries = allEntries.concat(entries);\n            readEntriesRecursive(reader, resolve, allEntries);\n        } else {\n            resolve(allEntries);\n        }\n    });\n}\n\nfunction transformFileEntry(entry: WebKitFileEntry) {\n    return new Promise(resolve => {\n        entry.file((file: any) => {\n            resolve(new UploadedFile(file as File, entry.fullPath));\n        });\n    });\n}\n","import { Directive, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { openUploadWindow } from '../utils/open-upload-window';\nimport { UploadedFile } from '../uploaded-file';\nimport { readUploadedFolders } from '../utils/read-uploaded-folders';\nimport { UploadInputConfig } from '@common/uploads/upload-input-config';\n\n@Directive({\n    selector: '[fileDropzone]',\n})\nexport class UploadDropzoneDirective implements OnInit, OnDestroy {\n    @Input() disableDropzoneClick = false;\n    @Input() disableDropzone = false;\n    @Input() clickButton: ElementRef;\n    @Input('fileDropzone') uploadConfig: UploadInputConfig = {};\n    @Output() filesDropped: EventEmitter<UploadedFile[]> = new EventEmitter();\n\n    constructor(protected el: ElementRef) {}\n\n    ngOnInit() {\n        const el = this.el.nativeElement;\n        el.addEventListener('dragenter', (e) => this.handleDragEnter(e));\n        el.addEventListener('dragover', (e) => this.handleDragOver(e));\n        el.addEventListener('dragleave', (e) => this.handleDragLeave(e));\n        el.addEventListener('drop', (e) => this.handleDrop(e));\n\n        if ( ! this.disableDropzoneClick) {\n            const trigger = this.clickButton ? this.clickButton.nativeElement : el;\n            trigger.addEventListener('click', () => this.handleClick());\n        }\n    }\n\n    ngOnDestroy() {\n        this.removeClassesFromDropzone();\n    }\n\n    protected handleClick() {\n        if (this.disableDropzone) return;\n        openUploadWindow(this.uploadConfig).then(files => {\n            this.emitUploadEvent(files);\n        });\n    }\n\n    public handleDragEnter(e) {\n        if (this.dropzoneDisabled(e)) return;\n        this.el.nativeElement.classList.add('file-over-dropzone');\n    }\n\n    public handleDragOver(e) {\n        if (e.preventDefault) e.preventDefault();\n        e.dataTransfer.dropEffect = this.dropzoneDisabled(e) ? 'none' : 'move';\n        return false;\n    }\n\n    public handleDragLeave(e: MouseEvent) {\n        const newEl = document.elementFromPoint(e.clientX, e.clientY);\n        if (this.el.nativeElement.contains(newEl)) return;\n        this.removeClassesFromDropzone();\n    }\n\n    public async handleDrop(e) {\n        e.stopPropagation();\n        e.preventDefault();\n        this.removeClassesFromDropzone();\n        if (this.dropzoneDisabled(e) || !e.dataTransfer.items) return;\n\n        const items = Array.from(e.dataTransfer.items)\n            .filter((item: DataTransferItem) => item.kind === 'file')\n            .map((item: DataTransferItem) => {\n                return item.webkitGetAsEntry();\n            });\n\n        if (items.length) {\n            this.emitUploadEvent(await readUploadedFolders(items));\n        }\n    }\n\n    protected emitUploadEvent(files: UploadedFile[]) {\n        this.filesDropped.emit(files);\n    }\n\n    protected removeClassesFromDropzone() {\n        this.el.nativeElement.classList.remove('file-over-dropzone');\n    }\n\n    protected dropzoneDisabled(e: DragEvent) {\n        const hasFiles = e.dataTransfer.types.find(type => type.toLowerCase() === 'files');\n        return this.disableDropzone || ! hasFiles;\n    }\n}\n","import {Directive, ElementRef, NgZone, OnDestroy, OnInit} from '@angular/core';\nimport {fromEvent, Subscription} from 'rxjs';\nimport {debounceTime} from 'rxjs/operators';\n\n@Directive()\nexport abstract class InfiniteScroll implements OnInit, OnDestroy {\n    protected scrollSub: Subscription;\n    protected el: ElementRef<HTMLElement|Document>;\n    protected abstract zone: NgZone;\n\n    public threshold: number | string = 50;\n\n    ngOnInit() {\n        if ( ! this.el) {\n            this.el = new ElementRef(document);\n        }\n        this.zone.runOutsideAngular(() => {\n            this.scrollSub = fromEvent(this.getScrollContainer(), 'scroll', {capture: true, passive: true})\n                .pipe(debounceTime(20))\n                .subscribe((e: Event) => this.onScroll(e.target as HTMLElement));\n        });\n    }\n\n    ngOnDestroy() {\n        this.scrollSub && this.scrollSub.unsubscribe();\n    }\n\n    protected getScrollContainer() {\n        return this.el ? this.el.nativeElement : document;\n    }\n\n    protected onScroll(target: HTMLElement) {\n        if (!target || (target !== this.el.nativeElement) || !this.canLoadMore() || this.isLoading()) return;\n\n        const offset = parseInt(this.threshold as string),\n            targetCanScroll = this.el && (typeof target.scrollTop !== 'undefined');\n\n        const currentScroll = targetCanScroll ?\n            target.scrollTop + target.offsetHeight :\n            window.scrollY + window.innerHeight;\n\n        const heightWithoutOffset = targetCanScroll ?\n            target.scrollHeight - offset :\n            document.documentElement.scrollHeight - offset;\n\n        if (currentScroll >= heightWithoutOffset) {\n            this.zone.run(() => {\n                this.loadMoreItems();\n            });\n        }\n    }\n\n    protected abstract loadMoreItems();\n\n    protected abstract canLoadMore(): boolean;\n\n    protected abstract isLoading(): boolean;\n}\n","import { Directive, ElementRef, NgZone } from '@angular/core';\nimport { LoadMoreEntries } from '../state/actions/commands';\nimport { Store } from '@ngxs/store';\nimport { DriveState } from '../state/drive-state';\nimport { InfiniteScroll } from '@common/core/ui/infinite-scroll/infinite.scroll';\n\n@Directive({\n    selector: '[driveInfiniteScroll]'\n})\nexport class DriveInfiniteScrollDirective extends InfiniteScroll {\n    constructor(\n        protected el: ElementRef,\n        protected store: Store,\n        protected zone: NgZone,\n    ) {\n        super();\n    }\n\n    protected loadMoreItems() {\n        const page = this.store.selectSnapshot(DriveState.currentPage) + 1;\n        this.store.dispatch(new LoadMoreEntries({page}));\n    }\n\n    protected isLoading(): boolean {\n        return this.store.selectSnapshot(DriveState.loading);\n    }\n\n    protected canLoadMore(): boolean {\n        return this.store.selectSnapshot(DriveState.canLoadMoreEntries);\n    }\n}\n","import { ChangeDetectionStrategy, Component, HostBinding, Inject, Optional, ViewEncapsulation } from '@angular/core';\nimport { Store } from '@ngxs/store';\nimport { DriveEntry } from '../../../files/models/drive-entry';\nimport { CONTEXT_MENU_DATA } from '@common/core/ui/context-menu/context-menu-data';\nimport { EntryContextMenuOpened } from '../../../state/actions/events';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { DeselectAllEntries } from '../../../state/actions/commands';\n\nexport interface FileContextMenuData {\n    entry: DriveEntry;\n}\n\n@Component({\n    selector: 'drive-context-menu',\n    templateUrl: './drive-context-menu.component.html',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n})\nexport class DriveContextMenuComponent {\n    @HostBinding('class.context-menu') contextMenu = true;\n\n    constructor(\n        @Optional() @Inject(CONTEXT_MENU_DATA) public data: FileContextMenuData,\n        protected store: Store,\n        protected currentUser: CurrentUser\n    ) {\n        if (this.data && this.data.entry) {\n            this.store.dispatch(new EntryContextMenuOpened(this.data.entry));\n        } else {\n            this.store.dispatch(new DeselectAllEntries());\n        }\n    }\n}\n","<context-actions-container></context-actions-container>","<skeleton *ngIf=\"loading$ | async; else breadcrumbs\" @fadeOut></skeleton>\n<ng-template #breadcrumbs>\n    <div class=\"breadcrumb-container\" @fadeIn>\n        <ng-container *ngFor=\"let item of breadcrumb | async; last as last; first as first;\">\n            <div class=\"breadcrumb-item\" (click)=\"last ? openContextMenu(item, button) : openPage(item)\" [class.no-action]=\"!item.hasActions\" #button>\n                <span class=\"name\">{{first ? (item.viewName | trans) : item.viewName}}</span>\n                <mat-icon svgIcon=\"arrow-drop-down\" *ngIf=\"last && item.hasActions\"></mat-icon>\n            </div>\n            <mat-icon class=\"separator\" svgIcon=\"keyboard-arrow-right\" *ngIf=\"!last\"></mat-icon>\n        </ng-container>\n    </div>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\nimport { DriveEntryApiService } from '../../drive-entry-api.service';\nimport { Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { BehaviorSubject, combineLatest, Subscription } from 'rxjs';\nimport { Translations } from '@common/core/translations/translations.service';\nimport {\n    ContextMenu, ContextMenuParams\n} from '@common/core/ui/context-menu/context-menu.service';\nimport { DriveContextMenuComponent } from '../../context-actions/components/drive-context-menu/drive-context-menu.component';\nimport { distinctUntilChanged, filter, take } from 'rxjs/operators';\nimport { OpenFolder } from '../../state/actions/commands';\nimport {\n    DRIVE_PAGE_NAMES, DrivePage, FolderPage, SHARES_PAGE,\n} from '../../state/models/drive-page';\nimport { Navigate } from '@ngxs/router-plugin';\nimport { DriveFolder } from '../../folders/models/driveFolder';\nimport { SKELETON_ANIMATIONS } from '../../../../common/core/ui/skeleton/skeleton-animations';\nimport { WorkspacesService } from '../../../../common/workspaces/workspaces.service';\n\n@Component({\n    selector: 'entry-breadcrumbs',\n    templateUrl: './entry-breadcrumbs.component.html',\n    styleUrls: ['./entry-breadcrumbs.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    animations: [SKELETON_ANIMATIONS],\n})\nexport class EntryBreadcrumbsComponent implements OnInit, OnDestroy {\n    public breadcrumb: BehaviorSubject<DrivePage[]> = new BehaviorSubject([]);\n    public loading$ = new BehaviorSubject<boolean>(true);\n    private activePageSub: Subscription;\n\n    constructor(\n        private entriesApi: DriveEntryApiService,\n        private i18n: Translations,\n        private contextMenu: ContextMenu,\n        private store: Store,\n        private workspaces: WorkspacesService,\n    ) {}\n\n    ngOnInit() {\n        // wait until entries and user folders are loaded\n        combineLatest([\n            this.store.select(DriveState.meta),\n            this.store.select(DriveState.userFoldersLoaded),\n            this.workspaces.activeWorkspace$,\n        ]).pipe(\n            filter(([meta, foldersLoaded, workspace]) => meta.currentPage && foldersLoaded && !!workspace),\n            take(1)\n        ).subscribe(() => {\n            this.loading$.next(false);\n            this.bindToActivePage();\n        });\n    }\n\n    ngOnDestroy() {\n        this.activePageSub && this.activePageSub.unsubscribe();\n    }\n\n    public openPage(page: DrivePage) {\n        if (page.folder) {\n            this.store.dispatch(new OpenFolder(page.folder));\n        } else {\n            this.store.dispatch(new Navigate(['/drive/shares']));\n        }\n    }\n\n    public openContextMenu(item: DrivePage, origin: HTMLElement) {\n        let params = {originX: 'start', overlayX: 'start'} as ContextMenuParams;\n        switch (item.name) {\n            case DRIVE_PAGE_NAMES.TRASH:\n                return this.contextMenu.open(DriveContextMenuComponent, origin, params);\n            case DRIVE_PAGE_NAMES.FOLDER:\n                params = {data: {entry: this.store.selectSnapshot(DriveState.activeFolder)}, ...params};\n                return this.contextMenu.open(DriveContextMenuComponent, origin, params);\n        }\n    }\n\n    private generateBreadCrumb(page: DrivePage) {\n        const breadcrumbs = [this.getRootBreadcrumb(page)];\n\n        if (page.folder?.id) {\n            const folderPath = this.getBreadcrumbForFolder(page.folder);\n            breadcrumbs.push(...folderPath);\n        }\n        this.breadcrumb.next(breadcrumbs);\n    }\n\n    private getBreadcrumbForFolder(folder: DriveFolder) {\n        const allFolders = this.store.selectSnapshot(DriveState.flatFolders) || [];\n        const ids = (folder.path ? folder.path.split('/') : [folder.id]) as number[];\n        return ids.map(id => {\n            const pathFolder = folder.id === +id ? folder : allFolders.find(f => f.id === +id);\n            if (pathFolder) {\n                return new FolderPage(pathFolder);\n            }\n        }).filter(f => !!f);\n    }\n\n    private getRootBreadcrumb(page: DrivePage) {\n        if (page.name === DRIVE_PAGE_NAMES.FOLDER) {\n            const workspaceId = this.workspaces.activeId$.value;\n            const ROOT_FOLDER_PAGE = new FolderPage(this.store.selectSnapshot(DriveState.rootFolder));\n            if (workspaceId && page.folder.workspace_id === workspaceId) {\n                return {...ROOT_FOLDER_PAGE, viewName: this.workspaces.activeWorkspace$.value.name};\n            } else {\n                return !this.store.selectSnapshot(DriveState.userOwnsActiveFolder) ? SHARES_PAGE : ROOT_FOLDER_PAGE;\n            }\n        } else {\n            return page;\n        }\n    }\n\n    private bindToActivePage() {\n        this.activePageSub = combineLatest([\n            this.store.select(DriveState.activePage),\n            this.store.select(DriveState.flatFolders),\n        ]).pipe(\n            distinctUntilChanged(),\n            filter(([activePage]) => {\n                // wait until folder data is fully loaded\n                return activePage.name === DRIVE_PAGE_NAMES.FOLDER ? activePage.folder?.name : true;\n            })\n        ).subscribe(([activePage]) => {\n            this.generateBreadCrumb(activePage);\n        });\n    }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'drive-toolbar',\n    templateUrl: './drive-toolbar.component.html',\n    styleUrls: ['./drive-toolbar.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DriveToolbarComponent {\n}\n","<entry-breadcrumbs></entry-breadcrumbs>\n","export const AVAILABLE_SORTS: DriveSortOption[] = [\n    {name: 'file_size', viewName: 'Size'},\n    {name: 'name', viewName: 'Name'},\n    {name: 'updated_at', viewName: 'Last Modified'},\n    {name: 'created_at', viewName: 'Upload Date'},\n    {name: 'type', viewName: 'Type'},\n    {name: 'extension', viewName: 'Extension'},\n];\n\nexport interface DriveSortOption {\n    name: SortColumn;\n    viewName: string;\n}\n\nexport type SortColumn = 'file_size' | 'name' | 'updated_at' | 'created_at' | 'type' | 'extension';\nexport type SortDirection = 'desc'|'asc';\n\nexport interface SortValue {\n    column: SortColumn;\n    direction: SortDirection;\n}\n","<ng-container *ngIf=\"sort$ | async as sortValue\">\n    <span class=\"label\" trans>Sort by</span>\n    <button class=\"no-style\" [matMenuTriggerFor]=\"menu\" [disabled]=\"btnDisabled\">\n        <span class=\"sort-button-content\">\n            <span>{{getSortViewName(sortValue.column) | trans}}</span>\n            <mat-icon svgIcon=\"keyboard-arrow-down\" class=\"arrow-icon\"></mat-icon>\n        </span>\n        <mat-icon svgIcon=\"sort\" class=\"mobile-sort-button-content\"></mat-icon>\n    </button>\n    <mat-menu #menu=\"matMenu\" class=\"drive-sort-menu\">\n        <div class=\"title\" trans>Direction</div>\n        <button mat-menu-item (click)=\"changeDirection('asc')\" [class.active]=\"sortValue.direction === 'asc'\">\n            <mat-icon svgIcon=\"check\"></mat-icon>\n            <span trans>Ascending</span>\n        </button>\n        <button mat-menu-item (click)=\"changeDirection('desc')\" [class.active]=\"sortValue.direction === 'desc'\">\n            <mat-icon svgIcon=\"check\"></mat-icon>\n            <span trans>Descending</span>\n        </button>\n        <div class=\"separator\"></div>\n        <div class=\"title\" trans>Sort By</div>\n        <button mat-menu-item *ngFor=\"let sort of availableSorts\" (click)=\"changeSort(sort)\" [class.active]=\"sortValue.column === sort.name\">\n            <mat-icon svgIcon=\"check\"></mat-icon>\n            <span trans>{{sort.viewName}}</span>\n        </button>\n    </mat-menu>\n</ng-container>","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input } from '@angular/core';\nimport { AVAILABLE_SORTS, DriveSortOption, SortColumn, SortDirection, SortValue } from '../../entries/available-sorts';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\n\nconst DEFAULT_VALUE: SortValue = {column: 'updated_at', direction: 'desc'};\n\n@Component({\n    selector: 'entries-sort-button',\n    templateUrl: './entries-sort-button.component.html',\n    styleUrls: ['./entries-sort-button.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [{\n        provide: NG_VALUE_ACCESSOR,\n        useExisting: EntriesSortButtonComponent,\n        multi: true,\n    }]\n})\nexport class EntriesSortButtonComponent implements ControlValueAccessor {\n    @Input() btnDisabled = false;\n    public availableSorts = AVAILABLE_SORTS;\n    public propagateChange: Function;\n\n    public sort$: BehaviorSubject<SortValue> = new BehaviorSubject(DEFAULT_VALUE);\n\n    public changeSort(column: DriveSortOption) {\n        this.sort$.next({...this.sort$.value, column: column.name});\n        this.propagateChange(this.sort$.value);\n    }\n\n    public changeDirection(direction: SortDirection) {\n        this.sort$.next({...this.sort$.value, direction});\n        this.propagateChange(this.sort$.value);\n    }\n\n    public getSortViewName(column: SortColumn): string {\n        return this.availableSorts.find(sort => sort.name === column).viewName;\n    }\n\n    public writeValue(value: SortValue) {\n        this.sort$.next(value || DEFAULT_VALUE);\n    }\n\n    public registerOnChange(fn: Function) {\n        this.propagateChange = fn;\n    }\n\n    public registerOnTouched() {}\n}\n","<ng-container *ngFor=\"let action of actions$ | async\">\n    <ng-container *ngIf=\"action.visible()\">\n        <div class=\"separator\" *ngIf=\"!compact && action.separatorBefore\"></div>\n\n        <button class=\"context-menu-item\" *ngIf=\"!compact\" (click)=\"action.execute()\">\n            <mat-icon [svgIcon]=\"action.icon\"></mat-icon>\n            <span trans>{{action.viewName}}</span>\n        </button>\n\n        <button mat-icon-button (click)=\"action.execute()\" [matTooltip]=\"action.viewName | trans\" *ngIf=\"compact && action.showInCompact\">\n            <mat-icon [svgIcon]=\"action.icon\"></mat-icon>\n        </button>\n    </ng-container>\n</ng-container>\n\n<button mat-icon-button (click)=\"openMoreActionsMenu()\" [matTooltip]=\"'More actions' | trans\" #moreActionsButton *ngIf=\"compact && hasMoreActions$ | async\">\n    <mat-icon svgIcon=\"more-vert\"></mat-icon>\n</button>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    HostBinding,\n    Injector,\n    Input,\n    OnDestroy,\n    ViewChild,\n    ViewEncapsulation\n} from '@angular/core';\nimport { DriveState } from '../../../state/drive-state';\nimport { Store } from '@ngxs/store';\nimport { DriveContextAction } from '../../types/drive-context-action';\nimport { TrashActions } from '../../actions/trash-actions';\nimport { SharesActions } from '../../actions/shares-actions';\nimport { FolderActions } from '../../actions/folder-actions';\nimport { EntryActions } from '../../actions/entry-actions';\nimport { BehaviorSubject, combineLatest, Subscription } from 'rxjs';\nimport { DRIVE_PAGE_NAMES, DrivePage } from '../../../state/models/drive-page';\nimport { DriveContextMenuComponent } from '../drive-context-menu/drive-context-menu.component';\nimport { ContextMenu } from '@common/core/ui/context-menu/context-menu.service';\nimport { TrashPageActions } from '../../actions/trash-page-actions';\nimport { DriveEntry } from '../../../files/models/drive-entry';\n\n@Component({\n    selector: 'context-actions-container',\n    templateUrl: './context-actions-container.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextActionsContainerComponent implements OnDestroy {\n    @ViewChild('moreActionsButton', { read: ElementRef }) moreActionsButton: ElementRef;\n    @Input() @HostBinding('class.compact') compact = false;\n\n    // whether there are more actions to display in \"compact\" mode\n    public hasMoreActions$ = new BehaviorSubject(false);\n    public actions$: BehaviorSubject<DriveContextAction[]> = new BehaviorSubject([]);\n    private subscription: Subscription;\n\n    constructor(\n        private store: Store,\n        private injector: Injector,\n        private contextMenu: ContextMenu,\n    ) {\n        this.subscription = combineLatest([\n            this.store.select(DriveState.activePage),\n            this.store.select(DriveState.selectedEntry),\n        ]).subscribe(combined => {\n            this.setActions(combined[0], combined[1]);\n            this.hasMoreActions$.next(this.actions$.value.some(action => !action.showInCompact));\n        });\n    }\n\n    ngOnDestroy() {\n        this.subscription.unsubscribe();\n    }\n\n    public openMoreActionsMenu() {\n        const entry = this.store.selectSnapshot(DriveState.selectedEntryOrActiveFolder);\n        this.contextMenu.open(\n            DriveContextMenuComponent,\n            this.moreActionsButton.nativeElement,\n            {data: {entry}}\n        );\n    }\n\n    private setActions(activePage: DrivePage, selectedEntry: DriveEntry) {\n        // user clicked on \"trash\" page name in breadcrumb\n        if (activePage?.name === DRIVE_PAGE_NAMES.TRASH && !selectedEntry) {\n            this.actions$.next(this.injector.get(TrashPageActions).getActions());\n\n        // context menu opened for selected entries while in \"trash\" or \"shares\" page\n        } else if (activePage?.name === 'trash' && selectedEntry) {\n            this.actions$.next(this.injector.get(TrashActions).getActions());\n        } else if (activePage?.name === 'shares' && selectedEntry) {\n            this.setActionsForEntry();\n        // context menu opened by clicking on empty space in folder view or clicking on root folder breadcrumb\n        } else if (activePage?.folder && !selectedEntry?.id) {\n            this.actions$.next(this.injector.get(FolderActions).getActions());\n\n        // show entries context menu for \"starred\" page\n        } else if (activePage?.name === 'starred' || activePage?.name === 'recent') {\n            this.actions$.next(this.injector.get(EntryActions).getActions());\n\n        // default to entry actions if can't match to anything else\n        } else if (selectedEntry) {\n            this.setActionsForEntry();\n        } else {\n            this.actions$.next([]);\n        }\n    }\n\n    private setActionsForEntry() {\n        const entries = this.store.selectSnapshot(DriveState.selectedEntries).length\n            ? this.store.selectSnapshot(DriveState.selectedEntries)\n            : [this.store.selectSnapshot(DriveState.activeFolder)];\n        let isOwner = this.store.selectSnapshot(DriveState.selectedEntries).length\n            ? this.store.selectSnapshot(DriveState.userOwnsSelectedEntries)\n            : this.store.selectSnapshot(DriveState.userOwnsActiveFolder);\n        if (this.store.selectSnapshot(DriveState.activeWorkspace)?.id) {\n            isOwner = entries.every(e => e.workspace_id === this.store.selectSnapshot(DriveState.activeWorkspace)?.id);\n        }\n        if (isOwner) {\n            this.actions$.next(this.injector.get(EntryActions).getActions());\n        } else {\n            this.actions$.next(this.injector.get(SharesActions).getActions());\n        }\n    }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ElementRef } from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { Observable } from 'rxjs';\nimport { ContextMenu } from '@common/core/ui/context-menu/context-menu.service';\nimport { DriveContextMenuComponent } from '../../context-actions/components/drive-context-menu/drive-context-menu.component';\nimport { ToggleDetailsSidebar, SetViewMode } from '../../state/actions/commands';\n\n@Component({\n    selector: 'toolbar-actions',\n    templateUrl: './toolbar-actions.component.html',\n    styleUrls: ['./toolbar-actions.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ToolbarActionsComponent {\n    @ViewChild('moreActionsButton', { read: ElementRef }) moreActionsButton: ElementRef;\n    @Select(DriveState.anythingSelected) anythingSelected: Observable<boolean>;\n    @Select(DriveState.viewMode) viewMode: Observable<'list'|'grid'>;\n    @Select(DriveState.detailsOpen) activityOpen: Observable<boolean>;\n    @Select(DriveState.multipleEntriesSelected) multipleEntriesSelected$: Observable<boolean>;\n\n    constructor(\n        protected store: Store,\n        protected contextMenu: ContextMenu,\n    ) {}\n\n    public toggleViewMode() {\n        const current = this.store.selectSnapshot(DriveState.viewMode);\n        this.store.dispatch(new SetViewMode(current === 'list' ? 'grid' : 'list'));\n    }\n\n    public ToggleDetails() {\n        this.store.dispatch(new ToggleDetailsSidebar());\n    }\n\n    public openMoreActionsMenu() {\n        const entry = this.store.selectSnapshot(DriveState.selectedEntry);\n        this.contextMenu.open(\n            DriveContextMenuComponent,\n            this.moreActionsButton.nativeElement,\n            {data: {entry}}\n        );\n    }\n}\n","<context-actions-container [compact]=\"true\"></context-actions-container>\n\n<div class=\"always-visible-actions\">\n    <button mat-icon-button (click)=\"toggleViewMode()\">\n        <mat-icon [svgIcon]=\"(viewMode | async) === 'list' ? 'view-list' : 'view-module'\"></mat-icon>\n    </button>\n    <button mat-icon-button (click)=\"ToggleDetails()\" [class.active]=\"activityOpen | async\">\n        <mat-icon svgIcon=\"info\"></mat-icon>\n    </button>\n</div>\n\n","import {\n    ChangeDetectionStrategy, Component, OnInit, ViewEncapsulation\n} from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { ReloadPageEntries } from '../../state/actions/commands';\nimport { SortColumn, SortValue } from '../../entries/available-sorts';\nimport { DriveState } from '../../state/drive-state';\nimport { combineLatest, Observable } from 'rxjs';\nimport { DrivePage } from '../../state/models/drive-page';\nimport { FormControl } from '@angular/forms';\n\n@Component({\n    selector: 'file-list-header',\n    templateUrl: './file-list-header.component.html',\n    styleUrls: ['./file-list-header.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FileListHeaderComponent implements OnInit {\n    @Select(DriveState.sortColumn) sortColumn$: Observable<SortColumn>;\n    @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n\n    public sortFormControl = new FormControl({\n        column: this.store.selectSnapshot(DriveState.sortColumn),\n        direction: this.store.selectSnapshot(DriveState.sortDirection),\n    });\n\n    constructor(private store: Store) {}\n\n    ngOnInit() {\n        combineLatest([\n            this.store.select(DriveState.sortColumn),\n            this.store.select(DriveState.sortDirection),\n        ]).subscribe(([column, direction]) => {\n            this.sortFormControl.setValue({column, direction}, {emitEvent: false});\n        });\n        this.sortFormControl.valueChanges.subscribe((sort: SortValue) => {\n            this.store.dispatch(new ReloadPageEntries(\n                {orderBy: sort.column, orderDir: sort.direction}\n            ));\n        });\n    }\n}\n","<div class=\"sort-header\">\n   <entries-sort-button [btnDisabled]=\"(activePage$ | async)?.disableSort\" [formControl]=\"sortFormControl\"></entries-sort-button>\n</div>\n<toolbar-actions></toolbar-actions>","<material-navbar\n    [showToggleButton]=\"isMobile$ | async\"\n    (toggleButtonClick)=\"toggleSidebar()\"\n    menuPosition=\"drive-navbar\"\n>\n    <main-searchbar></main-searchbar>\n</material-navbar>\n\n<mat-sidenav-container>\n    <mat-sidenav\n        [mode]=\"(isMobile$ | async) ? 'over' : 'side'\"\n        [opened]=\"sidebarOpen$ | async\"\n        class=\"left-sidebar\"\n    >\n        <sidebar></sidebar>\n    </mat-sidenav>\n    <mat-sidenav\n        [opened]=\"activityOpen$ | async\"\n        [mode]=\"(isMobile$ | async) ? 'over' : 'side'\"\n        position=\"end\"\n        class=\"right-sidebar\"\n    >\n        <details-sidebar></details-sidebar>\n    </mat-sidenav>\n    <mat-sidenav-content\n        driveHammerInteractions\n        [class.has-rek]=\"settings.has('ads.drive') && !currentUser.isSubscribed()\"\n    >\n        <ad-host slot=\"ads.drive\"></ad-host>\n        <ng-container *ngIf=\"(activePage$ | async)?.name !== 'workspaces'\">\n            <drive-toolbar></drive-toolbar>\n            <file-list-header></file-list-header>\n        </ng-container>\n        <div class=\"loading-overlay-container\">\n            <div\n                class=\"files-container\"\n                #filesContainer\n                #scrollContainer\n                toggleSelectedClass\n                [class.dragging]=\"dragging | async\"\n                contextMenu=\"entry\"\n                [disableContextMenu]=\"!(canUpload$ | async)\"\n                fileDropzone\n                [disableDropzoneClick]=\"true\"\n                [disableDropzone]=\"!(canUpload$ | async)\"\n                driveInfiniteScroll\n                (filesDropped)=\"uploadFiles($event)\"\n            >\n                <router-outlet></router-outlet>\n            </div>\n            <loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n        </div>\n    </mat-sidenav-content>\n</mat-sidenav-container>\n\n<entry-drag-preview></entry-drag-preview>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    OnDestroy,\n    OnInit,\n    ViewChild,\n    ViewEncapsulation,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from './state/drive-state';\nimport { DriveDomCacheService } from './interactions/drive-dom-cache.service';\nimport { EntryDragPreviewComponent } from './interactions/entry-drag-preview/entry-drag-preview.component';\nimport { Observable, Subscription } from 'rxjs';\nimport {\n    LoadUserFolders,\n    LoadUserSpaceUsage,\n    ReloadPageEntries,\n    ResetState,\n    SetCurrentUser,\n    SetViewMode,\n    SetWorkspace,\n    ToggleSidebar,\n    UploadFiles\n} from './state/actions/commands';\nimport { UploadedFile } from '@common/uploads/uploaded-file';\nimport { Settings } from '@common/core/config/settings.service';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { BreakpointObserver } from '@angular/cdk/layout';\nimport { BreakpointChanged, UserSpaceUsageChanged } from './state/actions/events';\nimport { VIEW_MODE_KEY } from './state/models/drive-state-model';\nimport { LocalStorage } from '@common/core/services/local-storage.service';\nimport { User } from '@common/core/types/models/User';\nimport { WorkspacesService } from '../../common/workspaces/workspaces.service';\nimport { filter, skip } from 'rxjs/operators';\nimport { DrivePage, FolderPage } from './state/models/drive-page';\nimport { EntryActions } from './context-actions/actions/entry-actions';\nimport { FolderActions } from './context-actions/actions/folder-actions';\nimport { SharesActions } from './context-actions/actions/shares-actions';\nimport { TrashActions } from './context-actions/actions/trash-actions';\nimport { TrashPageActions } from './context-actions/actions/trash-page-actions';\nimport { ContextMenu } from '../../common/core/ui/context-menu/context-menu.service';\n\nconst actions = [EntryActions, FolderActions, SharesActions, TrashActions, TrashPageActions];\n\n@Component({\n    selector: 'drive',\n    templateUrl: './drive.component.html',\n    styleUrls: ['./drive.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n\n    // scope workspaces to drive component and make sure context menus get correct instance\n    providers: [...actions, ContextMenu, WorkspacesService],\n})\nexport class DriveComponent implements OnInit, OnDestroy {\n    @ViewChild('scrollContainer', { read: ElementRef, static: true }) scrollContainer: ElementRef;\n    @ViewChild('filesContainer', { static: true }) filesContainer: ElementRef;\n    @ViewChild(EntryDragPreviewComponent, { read: ElementRef, static: true }) dragPreview: ElementRef;\n    @Select(DriveState.dragging) dragging: Observable<boolean>;\n    @Select(DriveState.detailsOpen) activityOpen$: Observable<boolean>;\n    @Select(DriveState.sidebarOpen) sidebarOpen$: Observable<boolean>;\n    @Select(DriveState.loading) loading$: Observable<boolean>;\n    @Select(DriveState.isMobile) isMobile$: Observable<boolean>;\n    @Select(DriveState.canUpload) canUpload$: Observable<boolean>;\n    @Select(DriveState.activePage) activePage$: Observable<DrivePage>;\n\n    private subscriptions: Subscription[] = [];\n\n    constructor(\n        private store: Store,\n        private route: ActivatedRoute,\n        public currentUser: CurrentUser,\n        private localStorage: LocalStorage,\n        private domCache: DriveDomCacheService,\n        private breakpoints: BreakpointObserver,\n        private workspaces: WorkspacesService,\n        public settings: Settings,\n    ) {}\n\n    ngOnInit() {\n        this.setViewMode();\n        this.cacheDemoElements();\n        this.observeBreakpointChanges();\n        this.bindToWorkspace();\n        this.store.dispatch(new LoadUserFolders());\n        this.store.dispatch(new LoadUserSpaceUsage());\n\n        // TODO: refactor this once auth is moved to it's own store\n        this.store.dispatch(new SetCurrentUser(this.currentUser.getModel() as User));\n        this.currentUser.model$.subscribe(user => {\n            this.store.dispatch(new SetCurrentUser(user as User));\n        });\n    }\n\n    ngOnDestroy() {\n        this.store.dispatch(ResetState);\n        this.subscriptions.forEach(sub => sub.unsubscribe());\n        this.subscriptions = [];\n    }\n\n    public uploadFiles(files: UploadedFile[]) {\n        this.store.dispatch(new UploadFiles(files));\n    }\n\n    public toggleSidebar() {\n        this.store.dispatch(new ToggleSidebar());\n    }\n\n    private cacheDemoElements() {\n        this.domCache.filesCont = this.filesContainer.nativeElement;\n        this.domCache.scrollCont = this.scrollContainer.nativeElement;\n        this.domCache.dragPreview = this.dragPreview.nativeElement;\n    }\n\n    private setViewMode() {\n        this.store.dispatch(new SetViewMode(\n            this.localStorage.get(VIEW_MODE_KEY, this.settings.get('drive.default_view', 'grid')))\n        );\n    }\n\n    private observeBreakpointChanges() {\n        const sub = this.breakpoints.observe('(max-width: 1100px)').subscribe(result => {\n            this.store.dispatch(new BreakpointChanged({isMobile: result.matches}));\n        });\n        this.subscriptions.push(sub);\n    }\n\n    private bindToWorkspace() {\n        // skip initially selected workspace\n        const sub1 = this.workspaces.activeId$.pipe(skip(1)).subscribe(() => {\n            this.store.dispatch([\n                new ReloadPageEntries({}, new FolderPage(this.store.selectSnapshot(DriveState.rootFolder))),\n                new UserSpaceUsageChanged(),\n                new LoadUserFolders()\n            ]);\n        });\n        const sub3 = this.workspaces.activeWorkspace$.pipe(filter(w => !!w))\n            .subscribe(workspace => {\n                this.store.dispatch(new SetWorkspace(workspace));\n            });\n        const sub2 = this.workspaces.bindToNotificationClick();\n        this.subscriptions.push(sub1, sub2, sub3);\n    }\n}\n","<files-grid-item\n        *ngFor=\"let entry of entries; trackBy: trackById\"\n        [entry]=\"entry\"\n        [contextMenu]=\"{type: 'entry', entry: entry}\"\n        [disableContextMenu]=\"disableInteractions\"\n        [folderDropTarget]=\"entry\"\n></files-grid-item>","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input } from '@angular/core';\nimport { DriveEntry } from '../../models/drive-entry';\n\n@Component({\n    selector: 'files-grid',\n    templateUrl: './files-grid.component.html',\n    styleUrls: ['./files-grid.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilesGridComponent {\n    @Input() entries: DriveEntry[];\n    @Input() disableInteractions = false;\n    public trackById(index: number, entry: DriveEntry): number {\n        return entry.id;\n    }\n}\n","<table class=\"material-table\">\n    <thead>\n    <tr>\n        <th table-sort-header class=\"name-column\" trans>Name</th>\n        <th table-sort-header=\"updated_at\" class=\"last-updated-column\" trans>Last Updated</th>\n        <th table-sort-header=\"file_size\" class=\"size-column\" trans>Size</th>\n    </tr>\n    </thead>\n    <tbody>\n    <tr *ngFor=\"let file of entries; trackBy: trackById\" class=\"drive-entry\" [contextMenu]=\"{type: 'entry', entry: file}\" [disableContextMenu]=\"disableInteractions\" [attr.data-id]=\"file.id\"  [folderDropTarget]=\"file\">\n        <td data-label=\"Name\" class=\"name-column\">\n            <div class=\"file-name-container\">\n                <file-thumbnail [file]=\"file\"></file-thumbnail>\n                <div class=\"file-name\">\n                    <span class=\"entry-name\">{{file.name}}</span>\n                    <mat-icon class=\"star-icon\" svgIcon=\"star\" *ngIf=\"isStarred(file)\" [matTooltip]=\"'Starred' | trans\"></mat-icon>\n                </div>\n            </div>\n        </td>\n        <td data-label=\"Last Updated\" class=\"last-updated-column\">{{file.updated_at | formattedDate}}</td>\n        <td data-label=\"Size\" class=\"size-column\">{{file.file_size | formattedFileSize}}</td>\n    </tr>\n    </tbody>\n</table>\n","import {\n    ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit\n} from '@angular/core';\nimport { DriveEntry } from '../../models/drive-entry';\nimport { Store } from '@ngxs/store';\nimport { ReloadPageEntries } from '../../../state/actions/commands';\nimport { DatatableService } from '@common/datatable/datatable.service';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n    selector: 'files-list',\n    templateUrl: './files-list.component.html',\n    styleUrls: ['./files-list.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DatatableService],\n})\nexport class FilesListComponent implements OnInit, OnDestroy {\n    @Input() entries: DriveEntry[];\n    @Input() disableInteractions = false;\n\n    constructor(private store: Store, private datatable: DatatableService<DriveEntry>) {}\n\n    ngOnInit() {\n        this.datatable.init({\n            disableSort: this.disableInteractions,\n        });\n\n        this.datatable.sort$\n            .pipe(filter(v => !!Object.keys(v).length))\n            .subscribe(value => {\n                this.store.dispatch(new ReloadPageEntries(value as any));\n            });\n    }\n\n    ngOnDestroy() {\n        this.datatable.destroy();\n    }\n\n    public isStarred(entry: DriveEntry): boolean {\n        if ( ! entry.tags) return false;\n        return !!entry.tags.find(tag => tag.name === 'starred');\n    }\n\n    public trackById(index: number, entry: DriveEntry): number {\n        return entry.id;\n    }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'no-recent-entries',\n    templateUrl: './no-recent-entries.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoRecentEntriesComponent {\n}\n","<div class=\"no-results-message\">\n    <svg-image name=\"time-management\" class=\"icon\"></svg-image>\n    <div class=\"main\" trans>No recent entries.</div>\n    <div class=\"secondary\" trans>You have not uploaded any files or folders yet.</div>\n</div>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'no-trashed-entries',\n    templateUrl: './no-trashed-entries.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoTrashedEntriesComponent {\n}\n","<div class=\"no-results-message\">\n    <svg-image name=\"throw-away\" class=\"icon\"></svg-image>\n    <div class=\"main\" trans>Trash is empty.</div>\n    <div class=\"secondary\" trans>There are no files or folders in your trash currently.</div>\n</div>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'no-starred-entries',\n    templateUrl: './no-starred-entries.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoStarredEntriesComponent {\n}\n","<div class=\"no-results-message\">\n    <svg-image name=\"loving-it\" class=\"icon\"></svg-image>\n    <div class=\"main\" trans>Nothing is starred.</div>\n    <div class=\"secondary\" trans>Add stars to files and folders that you want to easily find later.</div>\n</div>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'no-shared-entries',\n    templateUrl: './no-shared-entries.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoSharedEntriesComponent {\n}\n","<div class=\"no-results-message\">\n    <svg-image name=\"share\" class=\"icon\"></svg-image>\n    <div class=\"main\" trans>Shared with me.</div>\n    <div class=\"secondary\" trans>Files and folders other people have shared with you.</div>\n</div>\n","<div class=\"no-results-message\" *ngIf=\"noQueryOrFilters$ | async\">\n    <svg-image name=\"file-searching\" class=\"icon\"></svg-image>\n    <div class=\"main\" trans>Begin typing or select a filter to search</div>\n    <div class=\"secondary\" trans>Search for files, folders and other content.</div>\n</div>\n\n<div class=\"no-results-message\" *ngIf=\"!(noQueryOrFilters$ | async)\">\n    <svg-image name=\"file-searching\" class=\"icon\"></svg-image>\n    <div class=\"main\" trans>No matches found.</div>\n    <div class=\"secondary\" trans>Try another search with different query or filters.</div>\n</div>\n","import {ChangeDetectionStrategy, Component, ViewEncapsulation} from '@angular/core';\nimport {Store} from '@ngxs/store';\nimport {DriveState} from '../../state/drive-state';\nimport {Observable} from 'rxjs';\nimport {map} from 'rxjs/operators';\n\n@Component({\n    selector: 'no-search-entries',\n    templateUrl: './no-search-entries.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NoSearchEntriesComponent {\n    noQueryOrFilters$: Observable<boolean>;\n\n    constructor(private store: Store) {\n        this.noQueryOrFilters$ = this.store\n            .select(DriveState.meta)\n            .pipe(map(m => !m.query && !m.filters));\n    }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, ElementRef, AfterViewInit, Inject } from '@angular/core';\nimport { DRIVE_UPLOAD_INPUT_CONFIG } from '../../upload-input-config';\nimport { UploadInputConfig } from '@common/uploads/upload-input-config';\nimport { Store } from '@ngxs/store';\nimport { UploadFiles } from '../../state/actions/commands';\nimport { openUploadWindow } from '@common/uploads/utils/open-upload-window';\n\n@Component({\n    selector: 'upload-dropzone',\n    templateUrl: './upload-dropzone.component.html',\n    styleUrls: ['./upload-dropzone.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UploadDropzoneComponent implements AfterViewInit {\n    @ViewChild('clickTarget', { static: true }) clickTarget: ElementRef;\n\n    constructor (\n        private store: Store,\n        @Inject(DRIVE_UPLOAD_INPUT_CONFIG) private uploadConfig: UploadInputConfig,\n    ) {}\n\n    ngAfterViewInit() {\n        this.clickTarget.nativeElement.addEventListener('click', () => {\n            openUploadWindow(this.uploadConfig).then(files => {\n                this.store.dispatch(new UploadFiles(files));\n            });\n        });\n    }\n}\n","<div class=\"animation-circle\"></div>\n<div class=\"content-circle\" #clickTarget>\n    <mat-icon class=\"main-icon\" svgIcon=\"upload-custom\"></mat-icon>\n    <div class=\"text initial-text\">\n        <div class=\"primary\" trans>Drop files or folders here</div>\n        <div class=\"secondary\" trans>or click to upload.</div>\n    </div>\n</div>","import { Component, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n    selector: 'no-folder-entries',\n    templateUrl: './no-folder-entries.component.html',\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class NoFolderEntriesComponent {\n}\n","<upload-dropzone></upload-dropzone>","<files-grid [entries]=\"entries$ | async\" *ngIf=\"(viewMode$ | async) === 'grid'; else filesList\"></files-grid>\n<ng-template #filesList>\n    <files-list [entries]=\"entries$ | async\"></files-list>\n</ng-template>\n\n<ng-container [ngSwitch]=\"activePageName$ | async\" *ngIf=\"noEntries | async\">\n    <no-recent-entries *ngSwitchCase=\"'recent'\"></no-recent-entries>\n    <no-trashed-entries *ngSwitchCase=\"'trash'\"></no-trashed-entries>\n    <no-starred-entries *ngSwitchCase=\"'starred'\"></no-starred-entries>\n    <no-shared-entries *ngSwitchCase=\"'shares'\"></no-shared-entries>\n    <no-search-entries *ngSwitchCase=\"'search'\"></no-search-entries>\n    <no-folder-entries *ngSwitchDefault></no-folder-entries>\n</ng-container>","import {\n    ChangeDetectionStrategy,\n    Component,\n    ElementRef,\n    HostBinding,\n    OnDestroy,\n    OnInit,\n    ViewEncapsulation\n} from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DriveState } from '../../state/drive-state';\nimport { DriveEntry } from '../../files/models/drive-entry';\nimport { Observable, Subscription } from 'rxjs';\nimport { DrivePageType } from '../../state/models/available-pages';\nimport { Keybinds } from '@common/core/keybinds/keybinds.service';\nimport {\n    DeleteSelectedEntries,\n    DeleteTrashedEntriesForever,\n    OpenConfirmDialog,\n    SelectAllEntries\n} from '../../state/actions/commands';\nimport { EntryDoubleTapped } from '../../state/actions/events';\nimport { DRIVE_PAGE_NAMES } from '../../state/models/drive-page';\n\n@Component({\n    selector: 'entries-container',\n    templateUrl: './entries-container.component.html',\n    styleUrls: ['./entries-container.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [Keybinds],\n})\nexport class EntriesContainerComponent implements OnInit, OnDestroy {\n    @HostBinding('attr.tabindex') tabindex = 0;\n    @Select(DriveState.entries) entries$: Observable<DriveEntry[]>;\n    @Select(DriveState.entriesEmpty) noEntries: Observable<boolean>;\n    @Select(DriveState.viewMode) viewMode$: Observable<'list'|'grid'>;\n    @Select(DriveState.activePageName) activePageName$: Observable<DrivePageType>;\n    private keybindSub: Subscription;\n\n    constructor(\n        private store: Store,\n        private el: ElementRef,\n        private keybinds: Keybinds,\n    ) {}\n\n    ngOnInit() {\n        this.keybindSub = this.keybinds.listenOn(this.el.nativeElement);\n        this.keybinds.addWithPreventDefault('ctrl+a', () => {\n            this.store.dispatch(new SelectAllEntries());\n        });\n        this.keybinds.addWithPreventDefault('delete', () => {\n            if (this.store.selectSnapshot(DriveState.activePageName) === DRIVE_PAGE_NAMES.TRASH) {\n                this.store.dispatch(new OpenConfirmDialog({\n                    title: 'Delete Forever',\n                    body: 'This will permanently delete selected items.',\n                    bodyBold: 'This action can not be undone.',\n                    ok: 'Delete Forever',\n                }, new DeleteTrashedEntriesForever()));\n            } else {\n                this.store.dispatch(new DeleteSelectedEntries());\n            }\n        });\n        this.keybinds.addWithPreventDefault('enter', () => {\n            this.store.dispatch(new EntryDoubleTapped(this.store.selectSnapshot(DriveState.selectedEntry)));\n        });\n    }\n\n    ngOnDestroy() {\n        this.keybindSub.unsubscribe();\n    }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const CURRENT_PREVIEW_FILE = new InjectionToken<any>('CURRENT_PREVIEW_FILE');\n","import { InjectionToken } from '@angular/core';\nimport { FileEntry } from '@common/uploads/types/file-entry';\n\nexport type PreviewUrlTransformer = (entry: FileEntry) => string;\n\nexport const PREVIEW_URL_TRANSFORMER = new InjectionToken<PreviewUrlTransformer>('PREVIEW_URL_TRANSFORMER', {\n    factory: () => {\n        return entry => entry.url;\n    },\n    providedIn: 'root',\n});\n","import { EventEmitter, HostBinding, Inject, Directive } from '@angular/core';\nimport { CURRENT_PREVIEW_FILE } from './current-preview-file';\nimport { FileEntry } from '../uploads/types/file-entry';\nimport { PREVIEW_URL_TRANSFORMER, PreviewUrlTransformer } from './preview-url-transformer';\nimport { Settings } from '../core/config/settings.service';\nimport { Observable } from 'rxjs';\nimport { AppHttpClient } from '../core/http/app-http-client.service';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { CurrentUser } from '../auth/current-user';\n\n@Directive()\nexport abstract class BaseFilePreview {\n    @HostBinding('class.file-preview-wrapper') filePreviewWrapper = true;\n    public download = new EventEmitter();\n\n    constructor(\n        @Inject(CURRENT_PREVIEW_FILE) protected file: FileEntry,\n        @Inject(PREVIEW_URL_TRANSFORMER) protected transformer: PreviewUrlTransformer,\n        protected settings: Settings,\n        protected http: AppHttpClient,\n        protected sanitizer: DomSanitizer,\n        protected currentUser: CurrentUser,\n    ) {}\n\n    public getSrc(): string {\n        return this.transformer(this.file);\n    }\n\n    public getSafeSrc(): SafeResourceUrl {\n        return this.sanitizer.bypassSecurityTrustResourceUrl(this.getSrc());\n    }\n\n    public getContents(): Observable<string> {\n        return this.http.get(this.getSrc(), null, {responseType: 'text'});\n    }\n}\n","<div class=\"panel preview-object\">\n    <div class=\"message\">{{getMessage() | trans}}</div>\n    <button mat-raised-button color=\"accent\" (click)=\"download.emit()\" *ngIf=\"download.observers.length\" trans>Download</button>\n</div>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n    selector: 'default-preview',\n    templateUrl: './default-preview.component.html',\n    styleUrls: ['./default-preview.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DefaultPreviewComponent extends BaseFilePreview {\n    @Input() message: string;\n\n    public getMessage() {\n        return this.message || 'No file preview available.';\n    }\n}\n","<default-preview *ngIf=\"fileTooLarge$ | async; else textPreview\" message=\"This file is too large to preview.\"></default-preview>\n<ng-template #textPreview>\n    <div class=\"text-wrapper preview-object\">\n        <pre>{{ content$ | async }}</pre>\n    </div>\n</ng-template>","import {ChangeDetectionStrategy, Component, OnInit} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {BaseFilePreview} from '../base-file-preview';\n\nconst FIVE_MB = 5242880;\n\n@Component({\n    selector: 'text-preview',\n    templateUrl: './text-preview.component.html',\n    styleUrls: ['./text-preview.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextPreviewComponent extends BaseFilePreview implements OnInit {\n    public content$ = new BehaviorSubject('');\n    public fileTooLarge$ = new BehaviorSubject(false);\n\n    ngOnInit() {\n        if (this.file.file_size > FIVE_MB) {\n            this.fileTooLarge$.next(true);\n        } else {\n            this.loadFileContents();\n        }\n    }\n\n    private loadFileContents() {\n        this.getContents()\n            .subscribe(content => {\n                this.content$.next(content);\n            });\n    }\n}\n","<audio #playerEl controls=\"controls\" class=\"preview-object\" [class.hidden]=\"invalidMedia\" controlsList=\"nodownload noremoteplayback\"></audio>\n\n<default-preview *ngIf=\"invalidMedia\"></default-preview>","import {ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n    selector: 'audio-preview',\n    templateUrl: './audio-preview.component.html',\n    styleUrls: ['./audio-preview.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AudioPreviewComponent extends BaseFilePreview implements OnInit {\n    @ViewChild('playerEl', { static: true }) playerEl: ElementRef;\n    public invalidMedia = false;\n\n    ngOnInit() {\n        this.invalidMedia = !this.canPlayVideo();\n\n        if ( ! this.invalidMedia) {\n            const source = document.createElement('source');\n            source.src = this.getSrc();\n            source.type = this.file.mime;\n            this.player().appendChild(source);\n            this.player().play();\n        }\n    }\n\n    protected canPlayVideo(): boolean {\n        return !!this.player().canPlayType(this.file.mime);\n    }\n\n    protected player() {\n        return this.playerEl.nativeElement as HTMLVideoElement|HTMLAudioElement;\n    }\n}\n","<video\n    #playerEl\n    controls=\"controls\"\n    class=\"preview-object\"\n    [class.hidden]=\"invalidMedia\"\n    type=\"video/mp4\"\n    controlsList=\"nodownload noremoteplayback\"\n    playsinline\n></video>\n\n<default-preview *ngIf=\"invalidMedia\"></default-preview>\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {AudioPreviewComponent} from '../audio-preview/audio-preview.component';\n\n@Component({\n    selector: 'video-preview',\n    templateUrl: './video-preview.component.html',\n    styleUrls: ['./video-preview.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class VideoPreviewComponent extends AudioPreviewComponent {\n}\n","import {ChangeDetectionStrategy, Component} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n    selector: 'image-preview',\n    templateUrl: './image-preview.component.html',\n    styleUrls: ['./image-preview.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ImagePreviewComponent extends BaseFilePreview {}\n","<img [src]=\"getSafeSrc()\" class=\"preview-object\">","import {ChangeDetectionStrategy, Component, HostBinding,} from '@angular/core';\nimport {BaseFilePreview} from '../base-file-preview';\n\n@Component({\n  selector: 'pdf-preview',\n  templateUrl: './pdf-preview.component.html',\n  styleUrls: ['./pdf-preview.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PdfPreviewComponent extends BaseFilePreview {\n    @HostBinding('class') className = 'preview-object';\n\n    public getSrc() {\n        return super.getSrc() + '#toolbar=0';\n    }\n}\n","<iframe [src]=\"getSafeSrc()\"></iframe>","<ng-container *ngIf=\"!(showDefaultPreview$ | async); else defaultPreview\">\n    <iframe class=\"preview-object\" #iframe></iframe>\n    <div class=\"pop-out-block office-block\" (click)=\"openInNewWindow()\"></div>\n</ng-container>\n<ng-template #defaultPreview>\n    <default-preview></default-preview>\n</ng-template>\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, ViewChild } from '@angular/core';\nimport { BaseFilePreview } from '../base-file-preview';\nimport { BehaviorSubject } from 'rxjs';\nimport { GenericBackendResponse } from '@common/core/types/backend-response';\nimport { isAbsoluteUrl } from '@common/core/utils/is-absolute-url';\n\n@Component({\n    selector: 'google-docs-viewer',\n    templateUrl: './google-docs-viewer.component.html',\n    styleUrls: ['./google-docs-viewer.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GoogleDocsViewerComponent extends BaseFilePreview implements AfterViewInit {\n    @ViewChild('iframe') iframe: ElementRef<HTMLIFrameElement>;\n    public loading$ = new BehaviorSubject(true);\n    public showDefaultPreview$ = new BehaviorSubject(false);\n    private timeoutRef: any;\n\n    ngAfterViewInit() {\n        // google docs viewer only supports files up to 25MB\n        if (this.file.file_size > 25000000) {\n            return this.showDefaultPreview();\n        }\n\n        this.iframe.nativeElement.onload = () => {\n            clearTimeout(this.timeoutRef);\n            this.stopLoading();\n        };\n\n        this.getIframeSrc().then(url => {\n            this.iframe.nativeElement.src = url;\n        }).catch(() => {\n            this.showDefaultPreview();\n        });\n\n        // if preview iframe is not loaded\n        // after 5 seconds, bail and show default preview\n        this.timeoutRef = setTimeout(() => {\n            this.showDefaultPreview();\n        }, 5000);\n    }\n\n    public stopLoading() {\n        this.loading$.next(false);\n    }\n\n    public showDefaultPreview() {\n        this.stopLoading();\n        this.showDefaultPreview$.next(true);\n    }\n\n    public openInNewWindow() {\n        window.open(window.location.href, '_blank');\n    }\n\n    private getIframeSrc(): Promise<string> {\n        return new Promise((resolve, reject) => {\n            let previewUrl = this.getSrc();\n\n            // if we're not trying to preview shareable link we will need to generate\n            // preview token, otherwise google won't be able to access this file\n            if (previewUrl.indexOf('shareable_link') === -1) {\n                this.http.post<GenericBackendResponse<{preview_token: string}>>(`uploads/${this.file.id}/add-preview-token`).subscribe(response => {\n                    previewUrl += `?preview_token=${response.preview_token}`;\n                    resolve(this.getFullPreviewUrl(previewUrl));\n                }, () => reject);\n            } else {\n                resolve(this.getFullPreviewUrl(previewUrl));\n            }\n        });\n    }\n\n    private getFullPreviewUrl(previewUrl: string) {\n        // https://docs.google.com/gview?embedded=true&url=\n        previewUrl = isAbsoluteUrl(previewUrl) ? previewUrl : this.settings.getBaseUrl() + '/' + previewUrl;\n        return 'https://view.officeapps.live.com/op/embed.aspx?src=' + encodeURIComponent(previewUrl);\n    }\n}\n","import { InjectionToken, Injectable } from '@angular/core';\nimport { TextPreviewComponent } from './text-preview/text-preview.component';\nimport { VideoPreviewComponent } from './video-preview/video-preview.component';\nimport { ImagePreviewComponent } from './image-preview/image-preview.component';\nimport { PdfPreviewComponent } from './pdf-preview/pdf-preview.component';\nimport { AudioPreviewComponent } from './audio-preview/audio-preview.component';\nimport { GoogleDocsViewerComponent } from './google-docs-viewer/google-docs-viewer.component';\nimport {DefaultPreviewComponent} from './default-preview/default-preview.component';\n\nexport const AVAILABLE_PREVIEWS = new InjectionToken<any>('AVAILABLE_PREVIEWS');\n\n@Injectable()\nexport class DefaultPreviews {\n    text = TextPreviewComponent;\n    video = VideoPreviewComponent;\n    audio = AudioPreviewComponent;\n    image = ImagePreviewComponent;\n    pdf = PdfPreviewComponent;\n    spreadsheet = GoogleDocsViewerComponent;\n    powerPoint = GoogleDocsViewerComponent;\n    word = GoogleDocsViewerComponent;\n    'text/rtf' = DefaultPreviewComponent;\n}\n\n","import {Inject, Injectable, Injector} from '@angular/core';\nimport {FileEntry} from '../uploads/types/file-entry';\nimport {BehaviorSubject, Observable, Subject} from 'rxjs';\nimport {AVAILABLE_PREVIEWS, DefaultPreviews} from './available-previews';\nimport {ComponentPortal, PortalInjector} from '@angular/cdk/portal';\nimport {CURRENT_PREVIEW_FILE} from './current-preview-file';\nimport {DefaultPreviewComponent} from './default-preview/default-preview.component';\nimport {filter} from 'rxjs/operators';\nimport {PREVIEW_URL_TRANSFORMER, PreviewUrlTransformer} from './preview-url-transformer';\n\ninterface PreviewFilesMeta {\n    entry?: FileEntry;\n    pointer?: number;\n    total?: number;\n    haveNext?: boolean;\n    havePrevious?: boolean;\n}\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class PreviewFilesService {\n    private files: FileEntry[] = [];\n    private portal = new BehaviorSubject(null);\n    private meta: BehaviorSubject<PreviewFilesMeta> = new BehaviorSubject({});\n    private previewUriTransformer: PreviewUrlTransformer | null = null;\n    public download = new Subject();\n\n    constructor(\n        @Inject(AVAILABLE_PREVIEWS) private availablePreviews: DefaultPreviews,\n        private injector: Injector\n    ) {}\n\n    public pagination(): Observable<PreviewFilesMeta> {\n        return this.meta.pipe(filter(data => data && !!data.entry));\n    }\n\n    public getCurrent(): FileEntry {\n        return this.meta.value.entry;\n    }\n\n    public getAllEntries() {\n        return this.files;\n    }\n\n    public getPortal(): Observable<ComponentPortal<any>> {\n        return this.portal.asObservable();\n    }\n\n    public showNext() {\n        if (!this.meta.value.haveNext) return;\n        this.updateMeta('next');\n        this.updatePortal();\n    }\n\n    public showPrevious() {\n        if (!this.meta.value.havePrevious) return;\n        this.updateMeta('previous');\n        this.updatePortal();\n    }\n\n    private updateMeta(dir?: 'next' | 'previous' | number) {\n        let newPointer = 0;\n\n        if (typeof dir === 'string') {\n            const oldPointer = this.meta.value.pointer;\n            newPointer = dir === 'next' ? oldPointer + 1 : oldPointer - 1;\n        } else if (typeof dir === 'number') {\n            newPointer = dir;\n        }\n\n        this.meta.next({\n            pointer: newPointer,\n            entry: this.files[newPointer],\n            total: this.files.length,\n            haveNext: newPointer + 1 < this.files.length,\n            havePrevious: newPointer - 1 > -1,\n        });\n    }\n\n    private updatePortal() {\n        const file = this.getCurrent();\n        const comp =\n            this.availablePreviews[file?.mime] ||\n            this.availablePreviews[file?.type] ||\n            DefaultPreviewComponent;\n        this.portal.next(new ComponentPortal(comp, null, this.createInjector()));\n    }\n\n    public set(files: FileEntry[], activeFile?: number) {\n        if (!files || files.length === 0) return;\n        this.files = files.filter(entry => entry.type !== 'folder');\n        this.updateMeta(activeFile);\n        this.updatePortal();\n    }\n\n    private createInjector(): PortalInjector {\n        const injectionTokens = new WeakMap();\n\n        // set currently active preview file\n        injectionTokens.set(CURRENT_PREVIEW_FILE, this.getCurrent());\n\n        // override preview backend uri, if specified\n        if (this.previewUriTransformer) {\n            injectionTokens.set(PREVIEW_URL_TRANSFORMER, this.previewUriTransformer);\n        }\n\n        return new PortalInjector(this.injector, injectionTokens);\n    }\n\n    public destroy() {\n        this.meta.next({});\n        this.files = null;\n        this.portal.next(null);\n    }\n\n    /**\n     * Provide transformer function for preview file backend url.\n     * (for changing base uri, adding url params etc)\n     */\n    public setPreviewUriTransformer(transformer: PreviewUrlTransformer) {\n        this.previewUriTransformer = transformer;\n    }\n}\n","<mat-icon svgIcon=\"password-custom\"></mat-icon>\n<form class=\"content\" (ngSubmit)=\"submitPassword()\" ngNativeValidate>\n    <div class=\"message\" trans>The link you are trying to access is password protected.</div>\n    <div class=\"input-container\">\n        <label for=\"password\" class=\"hidden\" trans>Password</label>\n        <input type=\"password\" id=\"password\" placeholder=\"Password\" [formControl]=\"passwordControl\" trans-placeholder required>\n    </div>\n    <div class=\"button-container\">\n        <div class=\"error\" *ngIf=\"passwordError$ | async\" trans>Password does not match.</div>\n        <button type=\"submit\" mat-raised-button color=\"accent\" trans>Enter</button>\n    </div>\n</form>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\nimport { ShareableLinksApiService } from '../../../sharing/links/shareable-links-api.service';\nimport { ShareableLink } from '../../../sharing/links/models/shareable-link';\n\n@Component({\n    selector: 'link-preview-password-panel',\n    templateUrl: './link-preview-password-panel.component.html',\n    styleUrls: ['./link-preview-password-panel.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LinkPreviewPasswordPanelComponent {\n    public passwordControl = new FormControl();\n    public passwordError$ = new BehaviorSubject(false);\n\n    @Input() link: ShareableLink;\n    @Output() passwordValid = new EventEmitter(null);\n\n    constructor(private links: ShareableLinksApiService) {}\n\n    public submitPassword() {\n        this.links.checkPassword(this.link.id, this.passwordControl.value)\n            .subscribe(response => {\n               this.handlePasswordCheck(response.matches);\n            }, () => {});\n    }\n\n    private handlePasswordCheck(matches: boolean) {\n        this.passwordError$.next(!matches);\n\n        if (matches) {\n            this.passwordValid.emit(this.passwordControl.value);\n        }\n    }\n}\n","<button mat-icon-button class=\"back-button\" (click)=\"closed.emit(true)\" *ngIf=\"showCloseButton\">\n    <mat-icon svgIcon=\"arrow-back\"></mat-icon>\n</button>\n<ng-container *ngIf=\"previewFiles.pagination() | async as pagination\">\n    <div class=\"entry-name\">\n        <file-icon [type]=\"pagination.entry.type\"></file-icon>\n        {{pagination.entry.name}}\n    </div>\n\n    <ng-container *ngIf=\"previewFiles.pagination() | async as pagination\">\n        <div class=\"navigation\">\n            <button mat-icon-button class=\"previous\" [disabled]=\"!pagination.havePrevious\" (click)=\"previewFiles.showPrevious()\">\n                <mat-icon svgIcon=\"keyboard-arrow-left\"></mat-icon>\n            </button>\n\n            <span class=\"meta\">{{pagination.pointer + 1}} {{'of' | trans}} {{pagination.total}}</span>\n\n            <button mat-icon-button class=\"next\" [disabled]=\"!pagination.haveNext\" (click)=\"previewFiles.showNext()\">\n                <mat-icon svgIcon=\"keyboard-arrow-right\"></mat-icon>\n            </button>\n        </div>\n    </ng-container>\n\n    <div class=\"actions\">\n        <button mat-icon-button (click)=\"downloadFiles()\" [disabled]=\"disableDownload\">\n            <mat-icon svgIcon=\"file-download\"></mat-icon>\n        </button>\n        <ng-content></ng-content>\n    </div>\n</ng-container>\n<a routerLink=\"/drive\" class=\"logo\" *ngIf=\"showLogo && settings.has('branding.logo_light')\">\n    <img *ngIf=\"showLogo && settings.get('branding.logo_light')\" [src]=\"settings.get('branding.logo_light')\">\n</a>\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\nimport { PreviewFilesService } from '@common/file-preview/preview-files.service';\nimport { Settings } from '@common/core/config/settings.service';\n\n@Component({\n    selector: 'file-preview-toolbar',\n    templateUrl: './file-preview-toolbar.component.html',\n    styleUrls: ['./file-preview-toolbar.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilePreviewToolbarComponent {\n    @Input() showLogo = false;\n    @Input() disableDownload = false;\n    @Input() showCloseButton = false;\n\n    @Output() closed = new EventEmitter();\n\n    constructor(\n        public previewFiles: PreviewFilesService,\n        public settings: Settings,\n    ) {}\n\n    public downloadFiles() {\n        this.previewFiles.download.next();\n    }\n}\n","<ng-container *ngIf=\"previewFiles.getPortal() | async as portal\">\n    <ng-template [cdkPortalOutlet]=\"portal\" (attached)=\"listenForDownloadClick($event)\"></ng-template>\n</ng-container>\n","import {\n    ChangeDetectionStrategy,\n    Component,\n    ComponentRef,\n    Input,\n    OnChanges,\n    OnDestroy,\n} from '@angular/core';\nimport {FileEntry} from '../../uploads/types/file-entry';\nimport {PreviewFilesService} from '../preview-files.service';\nimport {BaseFilePreview} from '../base-file-preview';\nimport {Subscription} from 'rxjs';\n\n@Component({\n    selector: 'preview-container',\n    templateUrl: './preview-container.component.html',\n    styleUrls: ['./preview-container.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PreviewContainerComponent implements OnChanges, OnDestroy {\n    @Input() files: FileEntry[];\n    @Input() activeFile: number;\n    @Input() disableDownload = false;\n    private downloadSub: Subscription;\n\n    constructor(public previewFiles: PreviewFilesService) {}\n\n    ngOnChanges(changes) {\n        this.previewFiles.set(this.files, this.activeFile);\n    }\n\n    ngOnDestroy() {\n        this.previewFiles.destroy();\n        if (this.downloadSub) this.downloadSub.unsubscribe();\n    }\n\n    public listenForDownloadClick(comp: ComponentRef<BaseFilePreview>) {\n        if (this.downloadSub) this.downloadSub.unsubscribe();\n        if (!this.disableDownload) {\n            this.downloadSub = comp.instance.download.subscribe(() => {\n                this.previewFiles.download.next();\n            });\n        }\n    }\n}\n","<file-preview-toolbar [showCloseButton]=\"true\" (closed)=\"closeOverlay()\" [disableDownload]=\"!canDownload()\">\n    <button mat-icon-button (click)=\"openContextMenu()\" #moreOptionsButton *ngIf=\"!data.hideMoreOptionsBtn\">\n        <mat-icon svgIcon=\"more-vert\"></mat-icon>\n    </button>\n</file-preview-toolbar>\n<preview-container [files]=\"data.entries\" [activeFile]=\"data.activeEntry\" [disableDownload]=\"!canDownload()\" #previewContainer></preview-container>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Inject, OnDestroy, ViewChild, } from '@angular/core';\nimport { DriveEntry } from '../../files/models/drive-entry';\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 { DriveContextMenuComponent } from '../../context-actions/components/drive-context-menu/drive-context-menu.component';\nimport { ContextMenu } from '@common/core/ui/context-menu/context-menu.service';\nimport { PreviewFilesService } from '@common/file-preview/preview-files.service';\nimport { DownloadEntries } from '../../state/actions/commands';\nimport { Store } from '@ngxs/store';\nimport { Subscription } from 'rxjs';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { ShareableLink } from '../../sharing/links/models/shareable-link';\n\nexport interface FilePreviewOverlayData {\n    entries: DriveEntry[];\n    activeEntry?: number;\n    shareableLink?: ShareableLink;\n    password?: string;\n    hideMoreOptionsBtn?: boolean;\n}\n\n@Component({\n    selector: 'file-preview-overlay',\n    templateUrl: './file-preview-overlay.component.html',\n    styleUrls: ['./file-preview-overlay.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilePreviewOverlayComponent implements AfterViewInit, OnDestroy {\n    @ViewChild('previewContainer', { read: ElementRef, static: true }) previewContainer: ElementRef;\n    @ViewChild('moreOptionsButton', { read: ElementRef }) optionsButton: ElementRef;\n    private downloadSub: Subscription;\n\n    constructor(\n        private store: Store,\n        private el: ElementRef,\n        private contextMenu: ContextMenu,\n        private overlayRef: OverlayPanelRef,\n        private previewFiles: PreviewFilesService,\n        private currentUser: CurrentUser,\n        @Inject(OVERLAY_PANEL_DATA) public data: FilePreviewOverlayData\n    ) {}\n\n    ngAfterViewInit() {\n        this.bindToDownload();\n        // prevent ghost click from closing preview overlay\n        // when on mobile and single tap opens preview\n        setTimeout(() => {\n            this.previewContainer.nativeElement.addEventListener('click', e => {\n                if ( ! e.target.closest('.preview-object')) {\n                    this.overlayRef.close();\n                }\n            });\n        });\n    }\n\n    ngOnDestroy() {\n        this.downloadSub.unsubscribe();\n    }\n\n    public openContextMenu() {\n        const origin = this.optionsButton.nativeElement;\n        this.contextMenu.open(DriveContextMenuComponent, origin, {data: {entry: this.previewFiles.getCurrent()}});\n    }\n\n    public closeOverlay() {\n        this.overlayRef.close();\n    }\n\n    public canDownload() {\n        return this.data.entries.every(entry => {\n            if ( ! entry.users) entry.users = [];\n            const user = entry.users && entry.users.find(u => u.id === this.currentUser.get('id'));\n            const userHasDownloadPermission = user && (user.owns_entry || user.entry_permissions.download);\n            return this.data.shareableLink?.allow_download || userHasDownloadPermission;\n        });\n    }\n\n    private bindToDownload() {\n        this.downloadSub = this.previewFiles.download.subscribe(() => {\n            const entries = this.previewFiles.getCurrent();\n            this.store.dispatch(new DownloadEntries([entries], this.data.shareableLink, this.data.password));\n        });\n    }\n}\n","<material-navbar></material-navbar>\n\n<div class=\"toolbar\">\n    <div class=\"breadcrumb\">\n        <button mat-icon-button *ngIf=\"isSubFolder()\" (click)=\"openFolder()\" class=\"home-button\">\n            <mat-icon svgIcon=\"home\" class=\"action-icon\"></mat-icon>\n        </button>\n        <ng-container *ngFor=\"let folder of breadcrumb$ | async; last as last;\">\n            <div class=\"breadcrumb-item\" (click)=\"openFolder(folder)\">{{folder.name}}</div>\n            <mat-icon class=\"separator\" svgIcon=\"keyboard-arrow-right\" *ngIf=\"!last\"></mat-icon>\n        </ng-container>\n    </div>\n\n    <div class=\"actions\">\n        <entries-sort-button [formControl]=\"sortFormControl\"></entries-sort-button>\n\n        <span class=\"action-separator\"></span>\n\n        <ng-container *ngIf=\"viewMode$ | async as viewMode\">\n            <button mat-icon-button (click)=\"toggleViewMode()\" class=\"view-toggle-button\" [matTooltip]=\"(viewMode === 'list' ? 'Grid view' : 'List view') | trans\">\n                <mat-icon [svgIcon]=\"viewMode === 'list' ? 'view-list' : 'view-module'\" class=\"action-icon\"></mat-icon>\n            </button>\n        </ng-container>\n\n        <button mat-icon-button (click)=\"download()\" *ngIf=\"data.link.allow_download\" [matTooltip]=\"'Download all' | trans\">\n            <mat-icon svgIcon=\"file-download\" class=\"action-icon\"></mat-icon>\n        </button>\n\n        <ng-content></ng-content>\n    </div>\n</div>\n\n<ad-host slot=\"ads.file-preview\" class=\"folder-preview-vert-host\"></ad-host>\n\n<div class=\"files-container\" #filesContainer (click)=\"onClick($event)\">\n   <ng-container *ngIf=\"pagination$ | async as pagination\">\n       <files-grid [entries]=\"pagination.data\" [disableInteractions]=\"true\" *ngIf=\"(viewMode$ | async) === 'grid'; else filesList\"></files-grid>\n       <ng-template #filesList>\n           <files-list [entries]=\"pagination.data\" [disableInteractions]=\"true\"></files-list>\n       </ng-template>\n       <no-results-message *ngIf=\"!pagination.data.length\">\n           <span primary-text trans>Folder Is Empty</span>\n           <span secondary-text trans>No files have been uploaded to this folder yet.</span>\n       </no-results-message>\n   </ng-container>\n</div>\n\n<loading-indicator [isVisible]=\"loading$ | async\" class=\"overlay\"></loading-indicator>\n","import {\n    Component, ViewEncapsulation, ChangeDetectionStrategy, Input, ViewChild, ElementRef, OnInit, OnChanges, NgZone,\n} from '@angular/core';\nimport { Select, Store } from '@ngxs/store';\nimport { DownloadEntries, SetViewMode } from '../../state/actions/commands';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { FilePreviewOverlayComponent } from '../file-preview-overlay/file-preview-overlay.component';\nimport { Router } from '@angular/router';\nimport { FormControl } from '@angular/forms';\nimport { GetLinkData, ShareableLinksApiService } from '../../sharing/links/shareable-links-api.service';\nimport { finalize } from 'rxjs/operators';\nimport { SortValue } from '../../entries/available-sorts';\nimport { InfiniteScroll } from '@common/core/ui/infinite-scroll/infinite.scroll';\nimport { PaginationResponse } from '@common/core/types/pagination/pagination-response';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { OverlayPanel } from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport { DriveState } from '../../state/drive-state';\n\n@Component({\n    selector: 'folder-preview',\n    templateUrl: './folder-preview.component.html',\n    styleUrls: ['./folder-preview.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FolderPreviewComponent extends InfiniteScroll implements OnChanges, OnInit {\n    @Input() data: GetLinkData;\n    @Input() password: string;\n    @ViewChild('filesContainer', { static: true }) filesContainer: ElementRef<HTMLDivElement>;\n    @Select(DriveState.viewMode) viewMode$: Observable<'list'|'grid'>;\n\n    get folder() {\n        return this.data.link.entry;\n    }\n\n    get children() {\n        return this.pagination$.value.data;\n    }\n\n    public loading$ = new BehaviorSubject(false);\n    public breadcrumb$: BehaviorSubject<FileEntry[]> = new BehaviorSubject([]);\n    public pagination$: BehaviorSubject<PaginationResponse<FileEntry>> = new BehaviorSubject(null);\n    private allFolders = {};\n    public sortFormControl = new FormControl({\n        column: 'updated_at',\n        direction: 'desc',\n    });\n\n    constructor(\n        private store: Store,\n        private overlay: OverlayPanel,\n        private router: Router,\n        private linkApi: ShareableLinksApiService,\n        protected zone: NgZone,\n        protected el: ElementRef,\n    ) {\n        super();\n    }\n\n    ngOnInit() {\n        super.ngOnInit();\n        this.sortFormControl.valueChanges.subscribe((value: SortValue) => {\n            if (value) {\n                this.loadChildren({}, true);\n            }\n        });\n    }\n\n    ngOnChanges() {\n        this.allFolders[this.folder.id] = this.folder;\n        this.generateBreadcrumb(this.folder);\n        this.setPagination(this.data.folderChildren);\n        this.loading$.next(false);\n    }\n\n    public download() {\n        this.store.dispatch(new DownloadEntries([this.folder], this.data.link, this.password));\n    }\n\n    public toggleViewMode() {\n        const current = this.store.selectSnapshot(DriveState.viewMode);\n        this.store.dispatch(new SetViewMode(current === 'list' ? 'grid' : 'list'));\n    }\n\n    private openPreviewOverlay(entry: FileEntry) {\n        const entries = this.children.filter(ent => ent.type !== 'folder'),\n            activeEntry = entries.findIndex(e => e.id === entry.id);\n\n        this.overlay.open(FilePreviewOverlayComponent, {\n            position: 'center',\n            origin: 'global',\n            panelClass: 'file-preview-overlay-container',\n            data: {\n                entries: entries.slice(),\n                activeEntry,\n                shareableLink: this.data.link,\n                password: this.password,\n                hideMoreOptionsBtn: true,\n            }\n        });\n    }\n\n    private getEntry(e: MouseEvent): FileEntry {\n        const node = (e.target as HTMLElement).closest('.drive-entry') as HTMLElement;\n        if (node) {\n            return this.children.find(entry => entry.id === +node.dataset.id);\n        }\n    }\n\n    public onClick(e: MouseEvent) {\n        const entry = this.getEntry(e);\n        if ( ! entry) return;\n\n        if (entry.type === 'folder') {\n            this.openFolder(entry);\n        } else {\n            this.openPreviewOverlay(entry);\n        }\n    }\n\n    public isSubFolder() {\n        return this.router.url.indexOf(':') > -1;\n    }\n\n    public openFolder(folder?: FileEntry) {\n        if (folder && this.folder.id === folder.id) return;\n        this.loading$.next(true);\n        this.router.navigate(['/drive/s', this.makeLinkHash(folder)]).then(() => {\n            // reset sort to default, as there's no good way to\n            // pass current sort to parent link preview component\n            this.sortFormControl.reset();\n        });\n    }\n\n    private generateBreadcrumb(folder: FileEntry) {\n        this.breadcrumb$.next(folder.path.split('/').map(folderId => {\n            return this.allFolders[+folderId];\n        }).filter(subFolder => !!subFolder));\n    }\n\n    private loadChildren(params: {page?: number}, replaceChildren = false) {\n        this.loading$.next(true);\n        const sortCol = this.sortFormControl.value?.column || 'updated_at';\n        const sortDir = this.sortFormControl.value?.direction || 'desc';\n        const order = `${sortCol}:${sortDir}`;\n        const page = params.page || this.pagination$.value.current_page;\n        this.linkApi.findByHash(this.makeLinkHash(this.folder), {page, order, withEntries: true})\n            .pipe(finalize(() => this.loading$.next(false)))\n            .subscribe(response => {\n                const oldChildren = this.children;\n                const pagination = response.folderChildren;\n                if ( ! replaceChildren) {\n                    pagination.data = [...oldChildren, ...pagination.data];\n                }\n                this.setPagination(pagination);\n            });\n    }\n\n    private makeLinkHash(folder?: FileEntry) {\n        let hash = this.data.link.hash;\n        if (folder) hash += ':' + folder.hash;\n        return hash;\n    }\n\n    private setPagination(pagination: PaginationResponse<FileEntry>) {\n        // add shareable link hash to all entries url to avoid permission errors\n        pagination.data = pagination.data.map(entry => {\n            entry.url += `?shareable_link=${this.data.link.id}`;\n            if (this.password) {\n                entry.url += `&password=${this.password}`;\n            }\n            return entry;\n        });\n        this.pagination$.next(pagination);\n    }\n\n    protected loadMoreItems() {\n        const page = this.pagination$.value.current_page + 1;\n        this.loadChildren({page}, false);\n    }\n\n    protected canLoadMore() {\n        return this.pagination$.value.current_page < this.pagination$.value.last_page;\n    }\n\n    protected isLoading() {\n        return this.loading$.value;\n    }\n}\n","<ng-container *ngIf=\"data$ | async as data\">\n    <link-preview-password-panel\n        *ngIf=\"passwordPanelVisible$ | async; else filePreview\"\n        [link]=\"data.link\"\n        (passwordValid)=\"setValidPassword($event)\"\n    ></link-preview-password-panel>\n\n    <ng-template #filePreview>\n        <ng-container *ngIf=\"data.link.entry.type === 'folder'\">\n            <folder-preview [data]=\"data\" [password]=\"this.password\">\n                <ng-container *ngIf=\"!(entryAlreadyImported$ | async) && currentUser.isLoggedIn()\">\n                    <span class=\"action-separator\"></span>\n                    <button mat-flat-button color=\"accent\" (click)=\"import()\" trans>Import</button>\n                </ng-container>\n            </folder-preview>\n        </ng-container>\n\n        <ng-container *ngIf=\"data.link.entry.type !== 'folder'\">\n            <file-preview-toolbar [showLogo]=\"true\" [disableDownload]=\"!data.link.allow_download\">\n                <a\n                    mat-flat-button\n                    color=\"accent\"\n                    routerLink=\"/login\"\n                    *ngIf=\"!currentUser.isLoggedIn()\"\n                    trans\n                    >Sign In</a\n                >\n                <button\n                    mat-flat-button\n                    color=\"accent\"\n                    (click)=\"import()\"\n                    *ngIf=\"!(entryAlreadyImported$ | async) && currentUser.isLoggedIn()\"\n                    trans\n                >\n                    Import\n                </button>\n            </file-preview-toolbar>\n            <ad-host slot=\"ads.file-preview\" class=\"file-preview-vert-host\"></ad-host>\n            <preview-container\n                [files]=\"[data.link.entry]\"\n                [class.has-rek]=\"settings.has('ads.file-preview') && !currentUser.isSubscribed()\"\n            ></preview-container>\n        </ng-container>\n    </ng-template>\n</ng-container>\n","import { Component, OnInit, ViewEncapsulation, ChangeDetectionStrategy, OnDestroy, ElementRef } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { GetLinkData, ShareableLinksApiService } from '../../sharing/links/shareable-links-api.service';\nimport { BehaviorSubject, fromEvent, Observable, Subscription } from 'rxjs';\nimport { PreviewFilesService } from '@common/file-preview/preview-files.service';\nimport { Settings } from '@common/core/config/settings.service';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { filter, map } from 'rxjs/operators';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { Store } from '@ngxs/store';\nimport { DownloadEntries, SetViewMode } from '../../state/actions/commands';\nimport { ShareableLink } from '../../sharing/links/models/shareable-link';\nimport { VIEW_MODE_KEY } from '../../state/models/drive-state-model';\nimport { LocalStorage } from '@common/core/services/local-storage.service';\n\n@Component({\n    selector: 'link-preview-container',\n    templateUrl: './link-preview-container.component.html',\n    styleUrls: ['./link-preview-container.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        PreviewFilesService,\n    ]\n})\nexport class LinkPreviewContainerComponent implements OnInit, OnDestroy {\n    public data$: BehaviorSubject<GetLinkData> = new BehaviorSubject(null);\n    public passwordPanelVisible$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n    public password: string;\n    private downloadSub: Subscription;\n\n    /**\n     * Check if current user owns this entry or\n     * already has it imported into their drive.\n     */\n    public get entryAlreadyImported$(): Observable<boolean> {\n        const userId = this.currentUser.get('id');\n        return this.data$.pipe(\n            map(data => data.link),\n            filter(link => !!link && !!link.entry && !!link.entry.users),\n            map(link => link.entry),\n            map(entry => !!entry.users.find(user => user.id === userId))\n        );\n    }\n\n    constructor(\n        private store: Store,\n        private route: ActivatedRoute,\n        private links: ShareableLinksApiService,\n        public previewFiles: PreviewFilesService,\n        public settings: Settings,\n        public currentUser: CurrentUser,\n        private router: Router,\n        private toast: Toast,\n        private el: ElementRef<HTMLElement>,\n        private localStorage: LocalStorage,\n    ) {}\n\n    ngOnInit() {\n        this.bindToDownload();\n        this.disableContextMenu();\n        this.setViewMode();\n        this.route.params.subscribe(params => {\n            this.links.findByHash(params.hash, {withEntries: true}).subscribe(response => {\n                const linkChanged = response.link.id !== (this.data$.value && this.data$.value.link.id);\n                this.data$.next(response);\n                this.setBackgroundClass(response.link);\n\n                // prevent asking password for nested folders, if user already entered password\n                if (response.link.password && (linkChanged || !this.password)) {\n                    this.togglePasswordPanel(true);\n                } else {\n                    this.togglePasswordPanel(false);\n                    this.showPreview();\n                }\n            }, () => {\n                this.router.navigate(['/404']);\n            });\n        });\n    }\n\n    ngOnDestroy() {\n        this.downloadSub.unsubscribe();\n    }\n\n    public import() {\n        this.links.importEntry(this.data$.value.link.id, this.password)\n            .subscribe(response => {\n                const link = this.data$.value.link;\n                link.entry.users = response.users;\n                this.data$.next({...this.data$.value, link});\n                this.toast.open({\n                    message: `\":name\" imported into your drive.`,\n                    replacements: {name: link.entry.name},\n                });\n            });\n    }\n\n    public togglePasswordPanel(value: boolean) {\n        this.passwordPanelVisible$.next(value);\n    }\n\n    private bindToDownload() {\n        this.downloadSub = this.previewFiles.download.subscribe(() => {\n            const link = this.data$.value.link;\n            this.store.dispatch(new DownloadEntries([link.entry], link, this.password));\n        });\n    }\n\n    /**\n     * Show preview for shareable link files.\n     */\n    private showPreview() {\n        const data = this.data$.value;\n        data.link.entry.url += `?shareable_link=${data.link.id}`;\n        if (this.password) {\n            data.link.entry.url += `&password=${this.password}`;\n        }\n        this.data$.next({...data});\n    }\n\n    public setValidPassword(password: string) {\n        this.password = password;\n        this.showPreview();\n        this.togglePasswordPanel(false);\n    }\n\n    private setBackgroundClass(link: ShareableLink) {\n        const className = link.entry.type === 'folder' ? 'folder-link' : 'file-link';\n        this.el.nativeElement.classList.add(className);\n    }\n\n    private disableContextMenu() {\n        fromEvent(this.el.nativeElement, 'contextmenu')\n            .subscribe(e => {\n                e.preventDefault();\n            });\n    }\n\n    private setViewMode() {\n        this.store.dispatch(new SetViewMode(\n            this.localStorage.get(VIEW_MODE_KEY, this.settings.get('drive.default_view', 'grid')))\n        );\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { DriveComponent } from './drive.component';\nimport { EntriesContainerComponent } from './entries/entries-container/entries-container.component';\nimport { LinkPreviewContainerComponent } from './preview/link-preview-container/link-preview-container.component';\nimport { AuthGuard } from '@common/guards/auth-guard.service';\nimport { CheckPermissionsGuard } from '../../common/guards/check-permissions-guard.service';\n\nconst dashboardRoutes: Routes = [\n    // shareable links can be accessed by guests\n    {\n        path: 's/:hash',\n        component: LinkPreviewContainerComponent,\n    },\n\n    // main drive routes can only be accessed by logged in users\n    {\n        path: '',\n        component: DriveComponent,\n        canActivate: [AuthGuard, CheckPermissionsGuard],\n        children: [\n            { path: '', component: EntriesContainerComponent},\n            { path: 'shares', component: EntriesContainerComponent},\n            { path: 'search', component: EntriesContainerComponent},\n            { path: 'recent', component: EntriesContainerComponent},\n            { path: 'starred', component: EntriesContainerComponent},\n            { path: 'trash', component: EntriesContainerComponent},\n            { path: 'folders/:hash', component: EntriesContainerComponent},\n            {\n                path: 'workspaces',\n                loadChildren: () => import('src/app/drive/workspace-wrapper.module').then(m => m.WorkspaceWrapperModule)\n            },\n        ]\n    },\n];\n\n@NgModule({\n    imports: [\n        CommonModule,\n        RouterModule.forChild(dashboardRoutes)\n    ],\n    exports: [\n        RouterModule\n    ],\n})\nexport class DriveRoutingModule {}\n","import { InjectionToken, Component, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, Optional, Inject, Input, NgModule } from '@angular/core';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport { mixinColor, MatCommonModule } from '@angular/material/core';\nimport { coerceNumberProperty } from '@angular/cdk/coercion';\nimport { _getShadowRoot, Platform } from '@angular/cdk/platform';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Base reference size of the spinner.\n * @docs-private\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/platform';\nimport * as ɵngcc2 from '@angular/common';\n\nfunction MatProgressSpinner__svg_circle_1_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵnamespaceSVG();\n    ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n    const ctx_r0 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵstyleProp(\"animation-name\", \"mat-progress-spinner-stroke-rotate-\" + ctx_r0._spinnerAnimationLabel)(\"stroke-dashoffset\", ctx_r0._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r0._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r0._getCircleStrokeWidth(), \"%\");\n    ɵngcc0.ɵɵattribute(\"r\", ctx_r0._getCircleRadius());\n} }\nfunction MatProgressSpinner__svg_circle_2_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵnamespaceSVG();\n    ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n    const ctx_r1 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵstyleProp(\"stroke-dashoffset\", ctx_r1._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r1._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r1._getCircleStrokeWidth(), \"%\");\n    ɵngcc0.ɵɵattribute(\"r\", ctx_r1._getCircleRadius());\n} }\nfunction MatSpinner__svg_circle_1_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵnamespaceSVG();\n    ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n    const ctx_r0 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵstyleProp(\"animation-name\", \"mat-progress-spinner-stroke-rotate-\" + ctx_r0._spinnerAnimationLabel)(\"stroke-dashoffset\", ctx_r0._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r0._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r0._getCircleStrokeWidth(), \"%\");\n    ɵngcc0.ɵɵattribute(\"r\", ctx_r0._getCircleRadius());\n} }\nfunction MatSpinner__svg_circle_2_Template(rf, ctx) { if (rf & 1) {\n    ɵngcc0.ɵɵnamespaceSVG();\n    ɵngcc0.ɵɵelement(0, \"circle\", 3);\n} if (rf & 2) {\n    const ctx_r1 = ɵngcc0.ɵɵnextContext();\n    ɵngcc0.ɵɵstyleProp(\"stroke-dashoffset\", ctx_r1._getStrokeDashOffset(), \"px\")(\"stroke-dasharray\", ctx_r1._getStrokeCircumference(), \"px\")(\"stroke-width\", ctx_r1._getCircleStrokeWidth(), \"%\");\n    ɵngcc0.ɵɵattribute(\"r\", ctx_r1._getCircleRadius());\n} }\nconst _c0 = \".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\\n\";\nconst BASE_SIZE = 100;\n/**\n * Base reference stroke width of the spinner.\n * @docs-private\n */\nconst BASE_STROKE_WIDTH = 10;\n// Boilerplate for applying mixins to MatProgressSpinner.\n/** @docs-private */\nclass MatProgressSpinnerBase {\n    constructor(_elementRef) {\n        this._elementRef = _elementRef;\n    }\n}\nconst _MatProgressSpinnerMixinBase = mixinColor(MatProgressSpinnerBase, 'primary');\n/** Injection token to be used to override the default options for `mat-progress-spinner`. */\nconst MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS = new InjectionToken('mat-progress-spinner-default-options', {\n    providedIn: 'root',\n    factory: MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY,\n});\n/** @docs-private */\nfunction MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY() {\n    return { diameter: BASE_SIZE };\n}\n// .0001 percentage difference is necessary in order to avoid unwanted animation frames\n// for example because the animation duration is 4 seconds, .1% accounts to 4ms\n// which are enough to see the flicker described in\n// https://github.com/angular/components/issues/8984\nconst INDETERMINATE_ANIMATION_TEMPLATE = `\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n    0%      { stroke-dashoffset: START_VALUE;  transform: rotate(0); }\n    12.5%   { stroke-dashoffset: END_VALUE;    transform: rotate(0); }\n    12.5001%  { stroke-dashoffset: END_VALUE;    transform: rotateX(180deg) rotate(72.5deg); }\n    25%     { stroke-dashoffset: START_VALUE;  transform: rotateX(180deg) rotate(72.5deg); }\n\n    25.0001%   { stroke-dashoffset: START_VALUE;  transform: rotate(270deg); }\n    37.5%   { stroke-dashoffset: END_VALUE;    transform: rotate(270deg); }\n    37.5001%  { stroke-dashoffset: END_VALUE;    transform: rotateX(180deg) rotate(161.5deg); }\n    50%     { stroke-dashoffset: START_VALUE;  transform: rotateX(180deg) rotate(161.5deg); }\n\n    50.0001%  { stroke-dashoffset: START_VALUE;  transform: rotate(180deg); }\n    62.5%   { stroke-dashoffset: END_VALUE;    transform: rotate(180deg); }\n    62.5001%  { stroke-dashoffset: END_VALUE;    transform: rotateX(180deg) rotate(251.5deg); }\n    75%     { stroke-dashoffset: START_VALUE;  transform: rotateX(180deg) rotate(251.5deg); }\n\n    75.0001%  { stroke-dashoffset: START_VALUE;  transform: rotate(90deg); }\n    87.5%   { stroke-dashoffset: END_VALUE;    transform: rotate(90deg); }\n    87.5001%  { stroke-dashoffset: END_VALUE;    transform: rotateX(180deg) rotate(341.5deg); }\n    100%    { stroke-dashoffset: START_VALUE;  transform: rotateX(180deg) rotate(341.5deg); }\n  }\n`;\n/**\n * `<mat-progress-spinner>` component.\n */\nclass MatProgressSpinner extends _MatProgressSpinnerMixinBase {\n    constructor(_elementRef, platform, _document, animationMode, defaults) {\n        super(_elementRef);\n        this._elementRef = _elementRef;\n        this._document = _document;\n        this._diameter = BASE_SIZE;\n        this._value = 0;\n        this._fallbackAnimation = false;\n        /** Mode of the progress circle */\n        this.mode = 'determinate';\n        const trackedDiameters = MatProgressSpinner._diameters;\n        this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();\n        // The base size is already inserted via the component's structural styles. We still\n        // need to track it so we don't end up adding the same styles again.\n        if (!trackedDiameters.has(_document.head)) {\n            trackedDiameters.set(_document.head, new Set([BASE_SIZE]));\n        }\n        this._fallbackAnimation = platform.EDGE || platform.TRIDENT;\n        this._noopAnimations = animationMode === 'NoopAnimations' &&\n            (!!defaults && !defaults._forceAnimations);\n        if (defaults) {\n            if (defaults.diameter) {\n                this.diameter = defaults.diameter;\n            }\n            if (defaults.strokeWidth) {\n                this.strokeWidth = defaults.strokeWidth;\n            }\n        }\n    }\n    /** The diameter of the progress spinner (will set width and height of svg). */\n    get diameter() { return this._diameter; }\n    set diameter(size) {\n        this._diameter = coerceNumberProperty(size);\n        this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();\n        // If this is set before `ngOnInit`, the style root may not have been resolved yet.\n        if (!this._fallbackAnimation && this._styleRoot) {\n            this._attachStyleNode();\n        }\n    }\n    /** Stroke width of the progress spinner. */\n    get strokeWidth() {\n        return this._strokeWidth || this.diameter / 10;\n    }\n    set strokeWidth(value) {\n        this._strokeWidth = coerceNumberProperty(value);\n    }\n    /** Value of the progress circle. */\n    get value() {\n        return this.mode === 'determinate' ? this._value : 0;\n    }\n    set value(newValue) {\n        this._value = Math.max(0, Math.min(100, coerceNumberProperty(newValue)));\n    }\n    ngOnInit() {\n        const element = this._elementRef.nativeElement;\n        // Note that we need to look up the root node in ngOnInit, rather than the constructor, because\n        // Angular seems to create the element outside the shadow root and then moves it inside, if the\n        // node is inside an `ngIf` and a ShadowDom-encapsulated component.\n        this._styleRoot = _getShadowRoot(element) || this._document.head;\n        this._attachStyleNode();\n        // On IE and Edge, we can't animate the `stroke-dashoffset`\n        // reliably so we fall back to a non-spec animation.\n        const animationClass = `mat-progress-spinner-indeterminate${this._fallbackAnimation ? '-fallback' : ''}-animation`;\n        element.classList.add(animationClass);\n    }\n    /** The radius of the spinner, adjusted for stroke width. */\n    _getCircleRadius() {\n        return (this.diameter - BASE_STROKE_WIDTH) / 2;\n    }\n    /** The view box of the spinner's svg element. */\n    _getViewBox() {\n        const viewBox = this._getCircleRadius() * 2 + this.strokeWidth;\n        return `0 0 ${viewBox} ${viewBox}`;\n    }\n    /** The stroke circumference of the svg circle. */\n    _getStrokeCircumference() {\n        return 2 * Math.PI * this._getCircleRadius();\n    }\n    /** The dash offset of the svg circle. */\n    _getStrokeDashOffset() {\n        if (this.mode === 'determinate') {\n            return this._getStrokeCircumference() * (100 - this._value) / 100;\n        }\n        // In fallback mode set the circle to 80% and rotate it with CSS.\n        if (this._fallbackAnimation && this.mode === 'indeterminate') {\n            return this._getStrokeCircumference() * 0.2;\n        }\n        return null;\n    }\n    /** Stroke width of the circle in percent. */\n    _getCircleStrokeWidth() {\n        return this.strokeWidth / this.diameter * 100;\n    }\n    /** Dynamically generates a style tag containing the correct animation for this diameter. */\n    _attachStyleNode() {\n        const styleRoot = this._styleRoot;\n        const currentDiameter = this._diameter;\n        const diameters = MatProgressSpinner._diameters;\n        let diametersForElement = diameters.get(styleRoot);\n        if (!diametersForElement || !diametersForElement.has(currentDiameter)) {\n            const styleTag = this._document.createElement('style');\n            styleTag.setAttribute('mat-spinner-animation', this._spinnerAnimationLabel);\n            styleTag.textContent = this._getAnimationText();\n            styleRoot.appendChild(styleTag);\n            if (!diametersForElement) {\n                diametersForElement = new Set();\n                diameters.set(styleRoot, diametersForElement);\n            }\n            diametersForElement.add(currentDiameter);\n        }\n    }\n    /** Generates animation styles adjusted for the spinner's diameter. */\n    _getAnimationText() {\n        const strokeCircumference = this._getStrokeCircumference();\n        return INDETERMINATE_ANIMATION_TEMPLATE\n            // Animation should begin at 5% and end at 80%\n            .replace(/START_VALUE/g, `${0.95 * strokeCircumference}`)\n            .replace(/END_VALUE/g, `${0.2 * strokeCircumference}`)\n            .replace(/DIAMETER/g, `${this._spinnerAnimationLabel}`);\n    }\n    /** Returns the circle diameter formatted for use with the animation-name CSS property. */\n    _getSpinnerAnimationLabel() {\n        // The string of a float point number will include a period ‘.’ character,\n        // which is not valid for a CSS animation-name.\n        return this.diameter.toString().replace('.', '_');\n    }\n}\nMatProgressSpinner.ɵfac = function MatProgressSpinner_Factory(t) { return new (t || MatProgressSpinner)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵdirectiveInject(MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS)); };\nMatProgressSpinner.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatProgressSpinner, selectors: [[\"mat-progress-spinner\"]], hostAttrs: [\"role\", \"progressbar\", \"tabindex\", \"-1\", 1, \"mat-progress-spinner\"], hostVars: 10, hostBindings: function MatProgressSpinner_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵattribute(\"aria-valuemin\", ctx.mode === \"determinate\" ? 0 : null)(\"aria-valuemax\", ctx.mode === \"determinate\" ? 100 : null)(\"aria-valuenow\", ctx.mode === \"determinate\" ? ctx.value : null)(\"mode\", ctx.mode);\n        ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n        ɵngcc0.ɵɵclassProp(\"_mat-animation-noopable\", ctx._noopAnimations);\n    } }, inputs: { color: \"color\", mode: \"mode\", diameter: \"diameter\", strokeWidth: \"strokeWidth\", value: \"value\" }, exportAs: [\"matProgressSpinner\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 8, consts: [[\"preserveAspectRatio\", \"xMidYMid meet\", \"focusable\", \"false\", \"aria-hidden\", \"true\", 3, \"ngSwitch\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"animation-name\", \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\"]], template: function MatProgressSpinner_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵnamespaceSVG();\n        ɵngcc0.ɵɵelementStart(0, \"svg\", 0);\n        ɵngcc0.ɵɵtemplate(1, MatProgressSpinner__svg_circle_1_Template, 1, 9, \"circle\", 1);\n        ɵngcc0.ɵɵtemplate(2, MatProgressSpinner__svg_circle_2_Template, 1, 7, \"circle\", 2);\n        ɵngcc0.ɵɵelementEnd();\n    } if (rf & 2) {\n        ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n        ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx.mode === \"indeterminate\");\n        ɵngcc0.ɵɵattribute(\"viewBox\", ctx._getViewBox());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n    } }, directives: [ɵngcc2.NgSwitch, ɵngcc2.NgSwitchCase], styles: [_c0], encapsulation: 2, changeDetection: 0 });\n/**\n * Tracks diameters of existing instances to de-dupe generated styles (default d = 100).\n * We need to keep track of which elements the diameters were attached to, because for\n * elements in the Shadow DOM the style tags are attached to the shadow root, rather\n * than the document head.\n */\nMatProgressSpinner._diameters = new WeakMap();\nMatProgressSpinner.ctorParameters = () => [\n    { type: ElementRef },\n    { type: Platform },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }\n];\nMatProgressSpinner.propDecorators = {\n    diameter: [{ type: Input }],\n    strokeWidth: [{ type: Input }],\n    mode: [{ type: Input }],\n    value: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatProgressSpinner, [{\n        type: Component,\n        args: [{\n                selector: 'mat-progress-spinner',\n                exportAs: 'matProgressSpinner',\n                host: {\n                    'role': 'progressbar',\n                    'class': 'mat-progress-spinner',\n                    // set tab index to -1 so screen readers will read the aria-label\n                    // Note: there is a known issue with JAWS that does not read progressbar aria labels on FireFox\n                    'tabindex': '-1',\n                    '[class._mat-animation-noopable]': `_noopAnimations`,\n                    '[style.width.px]': 'diameter',\n                    '[style.height.px]': 'diameter',\n                    '[attr.aria-valuemin]': 'mode === \"determinate\" ? 0 : null',\n                    '[attr.aria-valuemax]': 'mode === \"determinate\" ? 100 : null',\n                    '[attr.aria-valuenow]': 'mode === \"determinate\" ? value : null',\n                    '[attr.mode]': 'mode'\n                },\n                inputs: ['color'],\n                template: \"<!--\\n  preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\\n  center. The center of the circle will remain at the center of the mat-progress-spinner\\n  element containing the SVG. `focusable=\\\"false\\\"` prevents IE from allowing the user to\\n  tab into the SVG element.\\n-->\\n<!--\\n  All children need to be hidden for screen readers in order to support ChromeVox.\\n  More context in the issue: https://github.com/angular/components/issues/22165.\\n-->\\n<svg\\n  [style.width.px]=\\\"diameter\\\"\\n  [style.height.px]=\\\"diameter\\\"\\n  [attr.viewBox]=\\\"_getViewBox()\\\"\\n  preserveAspectRatio=\\\"xMidYMid meet\\\"\\n  focusable=\\\"false\\\"\\n  [ngSwitch]=\\\"mode === 'indeterminate'\\\"\\n  aria-hidden=\\\"true\\\">\\n\\n  <!--\\n    Technically we can reuse the same `circle` element, however Safari has an issue that breaks\\n    the SVG rendering in determinate mode, after switching between indeterminate and determinate.\\n    Using a different element avoids the issue. An alternative to this is adding `display: none`\\n    for a split second and then removing it when switching between modes, but it's hard to know\\n    for how long to hide the element and it can cause the UI to blink.\\n  -->\\n  <circle\\n    *ngSwitchCase=\\\"true\\\"\\n    cx=\\\"50%\\\"\\n    cy=\\\"50%\\\"\\n    [attr.r]=\\\"_getCircleRadius()\\\"\\n    [style.animation-name]=\\\"'mat-progress-spinner-stroke-rotate-' + _spinnerAnimationLabel\\\"\\n    [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n    [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n    [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n\\n  <circle\\n    *ngSwitchCase=\\\"false\\\"\\n    cx=\\\"50%\\\"\\n    cy=\\\"50%\\\"\\n    [attr.r]=\\\"_getCircleRadius()\\\"\\n    [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n    [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n    [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n</svg>\\n\",\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None,\n                styles: [\".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\\n\"]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.Platform }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS]\n            }] }]; }, { mode: [{\n            type: Input\n        }], diameter: [{\n            type: Input\n        }], strokeWidth: [{\n            type: Input\n        }], value: [{\n            type: Input\n        }] }); })();\n/**\n * `<mat-spinner>` component.\n *\n * This is a component definition to be used as a convenience reference to create an\n * indeterminate `<mat-progress-spinner>` instance.\n */\nclass MatSpinner extends MatProgressSpinner {\n    constructor(elementRef, platform, document, animationMode, defaults) {\n        super(elementRef, platform, document, animationMode, defaults);\n        this.mode = 'indeterminate';\n    }\n}\nMatSpinner.ɵfac = function MatSpinner_Factory(t) { return new (t || MatSpinner)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.Platform), ɵngcc0.ɵɵdirectiveInject(DOCUMENT, 8), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵdirectiveInject(MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS)); };\nMatSpinner.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatSpinner, selectors: [[\"mat-spinner\"]], hostAttrs: [\"role\", \"progressbar\", \"mode\", \"indeterminate\", 1, \"mat-spinner\", \"mat-progress-spinner\"], hostVars: 6, hostBindings: function MatSpinner_HostBindings(rf, ctx) { if (rf & 2) {\n        ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n        ɵngcc0.ɵɵclassProp(\"_mat-animation-noopable\", ctx._noopAnimations);\n    } }, inputs: { color: \"color\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature], decls: 3, vars: 8, consts: [[\"preserveAspectRatio\", \"xMidYMid meet\", \"focusable\", \"false\", \"aria-hidden\", \"true\", 3, \"ngSwitch\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"animation-name\", \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\", 3, \"stroke-dashoffset\", \"stroke-dasharray\", \"stroke-width\", 4, \"ngSwitchCase\"], [\"cx\", \"50%\", \"cy\", \"50%\"]], template: function MatSpinner_Template(rf, ctx) { if (rf & 1) {\n        ɵngcc0.ɵɵnamespaceSVG();\n        ɵngcc0.ɵɵelementStart(0, \"svg\", 0);\n        ɵngcc0.ɵɵtemplate(1, MatSpinner__svg_circle_1_Template, 1, 9, \"circle\", 1);\n        ɵngcc0.ɵɵtemplate(2, MatSpinner__svg_circle_2_Template, 1, 7, \"circle\", 2);\n        ɵngcc0.ɵɵelementEnd();\n    } if (rf & 2) {\n        ɵngcc0.ɵɵstyleProp(\"width\", ctx.diameter, \"px\")(\"height\", ctx.diameter, \"px\");\n        ɵngcc0.ɵɵproperty(\"ngSwitch\", ctx.mode === \"indeterminate\");\n        ɵngcc0.ɵɵattribute(\"viewBox\", ctx._getViewBox());\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitchCase\", true);\n        ɵngcc0.ɵɵadvance(1);\n        ɵngcc0.ɵɵproperty(\"ngSwitchCase\", false);\n    } }, directives: [ɵngcc2.NgSwitch, ɵngcc2.NgSwitchCase], styles: [_c0], encapsulation: 2, changeDetection: 0 });\nMatSpinner.ctorParameters = () => [\n    { type: ElementRef },\n    { type: Platform },\n    { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },\n    { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n    { type: undefined, decorators: [{ type: Inject, args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatSpinner, [{\n        type: Component,\n        args: [{\n                selector: 'mat-spinner',\n                host: {\n                    'role': 'progressbar',\n                    'mode': 'indeterminate',\n                    'class': 'mat-spinner mat-progress-spinner',\n                    '[class._mat-animation-noopable]': `_noopAnimations`,\n                    '[style.width.px]': 'diameter',\n                    '[style.height.px]': 'diameter'\n                },\n                inputs: ['color'],\n                template: \"<!--\\n  preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\\n  center. The center of the circle will remain at the center of the mat-progress-spinner\\n  element containing the SVG. `focusable=\\\"false\\\"` prevents IE from allowing the user to\\n  tab into the SVG element.\\n-->\\n<!--\\n  All children need to be hidden for screen readers in order to support ChromeVox.\\n  More context in the issue: https://github.com/angular/components/issues/22165.\\n-->\\n<svg\\n  [style.width.px]=\\\"diameter\\\"\\n  [style.height.px]=\\\"diameter\\\"\\n  [attr.viewBox]=\\\"_getViewBox()\\\"\\n  preserveAspectRatio=\\\"xMidYMid meet\\\"\\n  focusable=\\\"false\\\"\\n  [ngSwitch]=\\\"mode === 'indeterminate'\\\"\\n  aria-hidden=\\\"true\\\">\\n\\n  <!--\\n    Technically we can reuse the same `circle` element, however Safari has an issue that breaks\\n    the SVG rendering in determinate mode, after switching between indeterminate and determinate.\\n    Using a different element avoids the issue. An alternative to this is adding `display: none`\\n    for a split second and then removing it when switching between modes, but it's hard to know\\n    for how long to hide the element and it can cause the UI to blink.\\n  -->\\n  <circle\\n    *ngSwitchCase=\\\"true\\\"\\n    cx=\\\"50%\\\"\\n    cy=\\\"50%\\\"\\n    [attr.r]=\\\"_getCircleRadius()\\\"\\n    [style.animation-name]=\\\"'mat-progress-spinner-stroke-rotate-' + _spinnerAnimationLabel\\\"\\n    [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n    [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n    [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n\\n  <circle\\n    *ngSwitchCase=\\\"false\\\"\\n    cx=\\\"50%\\\"\\n    cy=\\\"50%\\\"\\n    [attr.r]=\\\"_getCircleRadius()\\\"\\n    [style.stroke-dashoffset.px]=\\\"_getStrokeDashOffset()\\\"\\n    [style.stroke-dasharray.px]=\\\"_getStrokeCircumference()\\\"\\n    [style.stroke-width.%]=\\\"_getCircleStrokeWidth()\\\"></circle>\\n</svg>\\n\",\n                changeDetection: ChangeDetectionStrategy.OnPush,\n                encapsulation: ViewEncapsulation.None,\n                styles: [\".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\\n\"]\n            }]\n    }], function () { return [{ type: ɵngcc0.ElementRef }, { type: ɵngcc1.Platform }, { type: undefined, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [DOCUMENT]\n            }] }, { type: String, decorators: [{\n                type: Optional\n            }, {\n                type: Inject,\n                args: [ANIMATION_MODULE_TYPE]\n            }] }, { type: undefined, decorators: [{\n                type: Inject,\n                args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS]\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 MatProgressSpinnerModule {\n}\nMatProgressSpinnerModule.ɵfac = function MatProgressSpinnerModule_Factory(t) { return new (t || MatProgressSpinnerModule)(); };\nMatProgressSpinnerModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatProgressSpinnerModule });\nMatProgressSpinnerModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[MatCommonModule, CommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatProgressSpinnerModule, [{\n        type: NgModule,\n        args: [{\n                imports: [MatCommonModule, CommonModule],\n                exports: [\n                    MatProgressSpinner,\n                    MatSpinner,\n                    MatCommonModule\n                ],\n                declarations: [\n                    MatProgressSpinner,\n                    MatSpinner\n                ]\n            }]\n    }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatProgressSpinnerModule, { declarations: function () { return [MatProgressSpinner, MatSpinner]; }, imports: function () { return [MatCommonModule, CommonModule]; }, exports: function () { return [MatProgressSpinner, MatSpinner, 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_PROGRESS_SPINNER_DEFAULT_OPTIONS, MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, MatProgressSpinner, MatProgressSpinnerModule, MatSpinner };\n\n//# sourceMappingURL=progress-spinner.js.map","import { DriveContextMenuComponent } from './components/drive-context-menu/drive-context-menu.component';\n\nexport const DRIVE_CONTEXT_MENUS = {\n    entry: DriveContextMenuComponent,\n};\n","import {Actions, ofActionSuccessful, Store} from '@ngxs/store';\nimport {OpenFilePreview} from '../actions/commands';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {FilePreviewOverlayComponent} from '../../preview/file-preview-overlay/file-preview-overlay.component';\nimport {DriveState} from '../drive-state';\nimport {Injectable} from '@angular/core';\nimport {OverlayPanelRef} from '../../../../common/core/ui/overlay-panel/overlay-panel-ref';\n\n@Injectable()\nexport class OverlayHandler {\n    private overlayRef: OverlayPanelRef<FilePreviewOverlayComponent>;\n    constructor(\n        private store: Store,\n        private actions$: Actions,\n        private overlay: OverlayPanel\n    ) {\n        this.actions$\n            .pipe(ofActionSuccessful(OpenFilePreview))\n            .subscribe((action: OpenFilePreview) => {\n                if (this.overlayRef) {\n                    this.overlayRef.close();\n                    this.overlayRef = null;\n                }\n                const entries = this.store\n                    .selectSnapshot(DriveState.entries)\n                    .filter(e => e.type !== 'folder');\n                const selectedEntry = this.store.selectSnapshot(DriveState.selectedEntry);\n                const activeEntry = entries.findIndex(e => e.id === selectedEntry?.id);\n                this.overlayRef = this.overlay.open(FilePreviewOverlayComponent, {\n                    position: 'center',\n                    origin: 'global',\n                    panelClass: 'file-preview-overlay-container',\n                    data: {\n                        entries: entries.slice(),\n                        activeEntry: activeEntry === -1 ? 0 : activeEntry,\n                    },\n                });\n            });\n    }\n}\n","import { Actions, ofActionSuccessful, Store } from '@ngxs/store';\nimport { DownloadEntries } from '../actions/commands';\nimport { DriveState } from '../drive-state';\nimport { downloadFileFromUrl } from '@common/uploads/utils/download-file-from-url';\nimport { Settings } from '@common/core/config/settings.service';\nimport { FileEntry } from '@common/uploads/types/file-entry';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class DownloadHandler {\n    constructor(\n        private actions$: Actions,\n        private store: Store,\n        private settings: Settings,\n    ) {\n        this.actions$.pipe(ofActionSuccessful(DownloadEntries))\n            .subscribe((action: DownloadEntries) => {\n                downloadFileFromUrl(this.getDownloadUrl(action));\n            });\n    }\n\n    private getDownloadUrl(action: DownloadEntries): string {\n        const hashes = this.getEntryHashes(action.entries);\n        let base = `${this.settings.getBaseUrl()}/secure/uploads/download?hashes=${hashes}`;\n        if (action.link) base += `&shareable_link=${action.link.id}`;\n        if (action.password) base += `&password=${action.password}`;\n        return base;\n    }\n\n    /**\n     * Get hashes string for specified entries or for currently selected entries.\n     */\n    private getEntryHashes(entries?: FileEntry[]): string {\n        if ( ! entries) {\n            entries = this.store.selectSnapshot(DriveState.selectedEntries);\n        }\n\n        return entries.map(entry => entry.hash).join(',');\n    }\n}\n","import { Component, ViewEncapsulation, ChangeDetectionStrategy, Inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\n\n@Component({\n    selector: 'loading-toast',\n    templateUrl: './loading-toast.component.html',\n    styleUrls: ['./loading-toast.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class LoadingToastComponent {\n    constructor(@Inject(MAT_SNACK_BAR_DATA) public data: {message: string}) {}\n}\n","<mat-spinner [diameter]=\"30\"></mat-spinner>\n<span trans>{{ data.message }}</span>","import { Actions, ofAction, ofActionSuccessful, Store } from '@ngxs/store';\nimport { AddStar, HideLoadingToast, RemoveStar, RestoreTrashedEntries, ShowLoadingToast } from '../actions/commands';\nimport {\n    EntryRenamed,\n    FileDeleteSuccess,\n    MoveEntriesFailed,\n    MoveEntriesSuccess,\n    NewFolderCreated, NotEnoughSpaceError,\n    TrashedEntriesDeleteSuccess,\n    TrashedEntriesRestoreSuccess\n} from '../actions/events';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { LinkCopySuccess } from '../../sharing/links/share-link.state';\nimport { Router } from '@angular/router';\nimport { LoadingToastComponent } from '../../messages/loading-toast/loading-toast.component';\nimport { MatSnackBarRef } from '@angular/material/snack-bar';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class ToastHandler {\n    constructor(\n        private actions$: Actions,\n        private toast: Toast,\n        private store: Store,\n        private router: Router,\n    ) {\n        this.entriesDeleted();\n        this.entriesStarred();\n        this.entriesUnstarred();\n        this.entriesMoveFailed();\n        this.folderCreated();\n        this.entriesMoved();\n        this.entriesDeletedForever();\n        this.entriesRestoredFromTrash();\n        this.entryRenamed();\n        this.linkCopiedToClipboard();\n        this.notEnoughSpace();\n        this.loadingToast();\n    }\n\n    private entriesDeleted() {\n        this.actions$\n            .pipe(ofAction(FileDeleteSuccess))\n            .subscribe((action: FileDeleteSuccess) => {\n                const msg = {message: `Deleted :count items.`, replacements: {count: action.deletedFiles.length}};\n                this.toast.open(msg, {action: 'UNDO'})\n                    .onAction().subscribe(() => {\n                        this.store.dispatch(new RestoreTrashedEntries(action.deletedFiles));\n                    });\n            });\n    }\n\n    private entriesStarred() {\n        this.actions$\n            .pipe(ofActionSuccessful(AddStar))\n            .subscribe((action: AddStar) => {\n                this.toast.open(`Star added.`, {action: 'UNDO'}).onAction()\n                    .subscribe(() => {\n                        this.store.dispatch(new RemoveStar(action.entries));\n                    });\n            });\n    }\n\n    private entriesUnstarred() {\n        this.actions$\n            .pipe(ofActionSuccessful(RemoveStar))\n            .subscribe((action: RemoveStar) => {\n                this.toast.open(`Star Removed.`, {action: 'UNDO'}).onAction()\n                    .subscribe(() => {\n                        this.store.dispatch(new AddStar(action.entries));\n                    });\n            });\n    }\n\n    private entriesMoved() {\n        this.actions$.pipe(ofAction(MoveEntriesSuccess))\n            .subscribe((action: MoveEntriesSuccess) => {\n                this.toast.open(\n                    {message: 'Moved :count items.', replacements: {count: action.entries.length}}\n                );\n            });\n    }\n\n    private entriesMoveFailed() {\n        this.actions$.pipe(ofAction(MoveEntriesFailed))\n            .subscribe(() => {\n                this.toast.open('There was an issue with moving selected items.');\n            });\n    }\n\n    private folderCreated() {\n        this.actions$.pipe(ofAction(NewFolderCreated))\n            .subscribe(() => {\n                this.toast.open('Folder created.');\n            });\n    }\n\n    private entriesDeletedForever() {\n        this.actions$.pipe(ofActionSuccessful(TrashedEntriesDeleteSuccess))\n            .subscribe((action: TrashedEntriesDeleteSuccess) => {\n                this.toast.open({\n                    message: `Permanently deleted :count items.`,\n                    replacements: {count: action.entries.length}\n                });\n            });\n    }\n\n    private entriesRestoredFromTrash() {\n        this.actions$.pipe(ofActionSuccessful(TrashedEntriesRestoreSuccess))\n            .subscribe((action: TrashedEntriesRestoreSuccess) => {\n                this.toast.open({\n                    message: `Restored :count items.`,\n                    replacements: {count: action.entries.length}\n                });\n            });\n    }\n\n    private entryRenamed() {\n        this.actions$.pipe(ofActionSuccessful(EntryRenamed))\n            .subscribe((action: EntryRenamed) => {\n                this.toast.open({\n                    message: `:oldName renamed to :newName`,\n                    replacements: {oldName: action.entry.name, newName: action.newName}\n                });\n            });\n\n    }\n\n    private linkCopiedToClipboard() {\n        this.actions$.pipe(ofActionSuccessful(LinkCopySuccess))\n            .subscribe(() => {\n                this.toast.open(`Link copied to clipboard.`);\n            });\n    }\n\n    private notEnoughSpace() {\n        this.actions$.pipe(ofActionSuccessful(NotEnoughSpaceError))\n            .subscribe(() => {\n                this.toast.open(`You are out of space. Try to delete some files.`, {action: 'Upgrade'})\n                    .onAction().subscribe(() => {\n                        this.router.navigate(['/billing/upgrade']);\n                    });\n            });\n    }\n\n    private loadingToast() {\n        let toastRef: MatSnackBarRef<any>;\n\n        this.actions$.pipe(ofActionSuccessful(ShowLoadingToast))\n            .subscribe((action: ShowLoadingToast) => {\n                toastRef = this.toast.openComponent(LoadingToastComponent, {duration: 0, data: {message: action.message}});\n            });\n\n        this.actions$.pipe(ofActionSuccessful(HideLoadingToast))\n            .subscribe(() => {\n                if (toastRef) {\n                    toastRef.dismiss();\n                    toastRef = null;\n                }\n            });\n    }\n}\n","<file-icon [mime]=\"upload.uploadedFile.mime\"></file-icon>\n<div class=\"content\">\n    <div class=\"meta\">\n        <div class=\"name\" [matTooltip]=\"upload.uploadedFile.name\">{{upload.uploadedFile.name}}</div>\n        <div class=\"time-left\" *ngIf=\"progress.percentage && progress.percentage < 100 && !upload.error$.value\">\n            {{progress.eta}}\n            <span trans>left</span>\n        </div>\n        <div class=\"actions\">\n            <mat-icon\n                    svgIcon=\"error\"\n                    *ngIf=\"upload.error$ | async as error; else noError\"\n                    class=\"error-icon\"\n                    [matTooltip]=\"error | trans\"\n                    matTooltipPosition=\"left\"\n            ></mat-icon>\n            <ng-template #noError>\n                <mat-icon svgIcon=\"check-circle\" *ngIf=\"upload.completed\" class=\"completed-icon\"></mat-icon>\n                <span class=\"cancel-button\" *ngIf=\"!upload.completed\" (click)=\"cancelUpload(upload)\" trans>Cancel</span>\n            </ng-template>\n        </div>\n    </div>\n    <mat-progress-bar mode=\"determinate\" [value]=\"progress.percentage\" color=\"accent\"></mat-progress-bar>\n</div>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';\nimport { UploadQueueItem, UploadQueueItemProgress } from '@common/uploads/upload-queue/upload-queue-item';\nimport { UploadQueueService } from '@common/uploads/upload-queue/upload-queue.service';\nimport { Store } from '@ngxs/store';\nimport { CloseUploadsPanel } from '../../../state/actions/commands';\nimport { throttleTime } from 'rxjs/operators';\nimport { animationFrameScheduler, Subscription } from 'rxjs';\n\n@Component({\n    selector: 'uploads-panel-item',\n    templateUrl: './uploads-panel-item.component.html',\n    styleUrls: ['./uploads-panel-item.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UploadsPanelItemComponent implements OnInit, OnDestroy {\n    @Input() upload: UploadQueueItem;\n    public progress: UploadQueueItemProgress = {};\n    private subscription: Subscription;\n\n    constructor(\n        private uploadQueue: UploadQueueService,\n        private store: Store,\n        private cd: ChangeDetectorRef,\n    ) {}\n\n    ngOnInit() {\n        this.subscription = this.upload.progress$.pipe(\n            // material progress bar animation lasts 250ms\n            throttleTime(260, animationFrameScheduler, {leading: true, trailing: true}),\n        ).subscribe(progress => {\n            this.progress = progress;\n            this.cd.detectChanges();\n        });\n    }\n\n    ngOnDestroy() {\n        this.subscription.unsubscribe();\n    }\n\n    public cancelUpload(upload: UploadQueueItem) {\n        this.uploadQueue.remove(upload.id);\n        if (this.uploadQueue.isEmpty()) {\n            this.store.dispatch(new CloseUploadsPanel());\n        }\n    }\n}\n","<div class=\"header\">\n    <div class=\"info\">\n        <ng-container *ngIf=\"activeUploads.count$ | async as count\">\n            <ng-container *ngIf=\"count.pending > 0\">\n                {{ 'Uploading' | trans }} {{count.pending}} {{(count.pending > 1 ? 'Items' : 'Item') | trans}}\n            </ng-container>\n            <ng-container *ngIf=\"count.pending === 0\">\n                {{count.completed}} {{'items uploaded' | trans}}\n            </ng-container>\n        </ng-container>\n    </div>\n    <div class=\"actions\">\n        <button mat-icon-button (click)=\"toggleMinimized()\">\n            <mat-icon svgIcon=\"keyboard-arrow-up\" *ngIf=\"minimized$ | async; else notMinimized\" class=\"minimize-icon\"></mat-icon>\n            <ng-template #notMinimized>\n                <mat-icon svgIcon=\"keyboard-arrow-down\" class=\"minimize-icon\"></mat-icon>\n            </ng-template>\n        </button>\n        <button mat-icon-button (click)=\"close()\">\n            <mat-icon svgIcon=\"close\"></mat-icon>\n        </button>\n    </div>\n</div>\n\n<div class=\"uploads-list\" [class.hidden]=\"minimized$ | async\">\n    <uploads-panel-item *ngFor=\"let upload of activeUploads.uploads$ | async; trackBy: trackById\" [upload]=\"upload\"></uploads-panel-item>\n</div>\n","import { ChangeDetectionStrategy, Component, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { UploadQueueService } from '@common/uploads/upload-queue/upload-queue.service';\nimport { UploadQueueItem } from '@common/uploads/upload-queue/upload-queue-item';\nimport { Store } from '@ngxs/store';\nimport { CloseUploadsPanel } from '../../state/actions/commands';\nimport { BehaviorSubject } from 'rxjs';\n\n@Component({\n    selector: 'uploads-panel',\n    templateUrl: './uploads-panel.component.html',\n    styleUrls: ['./uploads-panel.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class UploadsPanelComponent implements OnDestroy {\n    public minimized$ = new BehaviorSubject(false);\n\n    constructor(\n        private store: Store,\n        public activeUploads: UploadQueueService,\n    ) {\n    }\n\n    ngOnDestroy() {\n        this.activeUploads.reset();\n    }\n\n    public toggleMinimized() {\n        this.minimized$.next(!this.minimized$.value);\n    }\n\n    public close() {\n        this.store.dispatch(new CloseUploadsPanel());\n    }\n\n    public trackById(index: number, upload: UploadQueueItem) {\n        return upload.id;\n    }\n}\n","import { Actions, ofActionSuccessful } from '@ngxs/store';\nimport { CloseUploadsPanel, OpenUploadsPanel } from '../actions/commands';\nimport { OverlayPanel } from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport { UploadsPanelComponent } from '../../uploads/uploads-panel/uploads-panel.component';\nimport { OverlayPanelRef } from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { OverlayPanelConfig } from '@common/core/ui/overlay-panel/overlay-panel-config';\nimport { Injectable } from '@angular/core';\n\nconst overlayConfig: OverlayPanelConfig = {\n    origin: 'global',\n    hasBackdrop: false,\n    position: {right: '10px', bottom: '10px'},\n    mobilePosition: {left: 0, bottom: 0}\n};\n\n@Injectable()\nexport class UploadPanelHandler {\n    private uploadPanelRef: OverlayPanelRef<UploadsPanelComponent>;\n\n    constructor(\n        private actions$: Actions,\n        private currentUser: CurrentUser,\n        private overlayPanel: OverlayPanel,\n    ) {\n        this.actions$\n            .pipe(ofActionSuccessful(OpenUploadsPanel))\n            .subscribe(() => {\n                this.openUploadsPanel();\n            });\n\n        this.actions$\n            .pipe(ofActionSuccessful(CloseUploadsPanel))\n            .subscribe(() => {\n               this.closeUploadsPanel();\n            });\n\n        this.currentUser.model$.subscribe(() => {\n            this.closeUploadsPanel();\n        });\n    }\n\n    public openUploadsPanel() {\n        if (this.uploadPanelRef) return;\n        this.uploadPanelRef = this.overlayPanel\n            .open(UploadsPanelComponent, overlayConfig);\n    }\n\n    private closeUploadsPanel() {\n        if ( ! this.uploadPanelRef) return;\n        this.uploadPanelRef.close();\n        this.uploadPanelRef = null;\n    }\n}\n","import { Actions, ofActionDispatched, Store } from '@ngxs/store';\nimport { OpenConfirmDialog, OpenDialog } from '../actions/commands';\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()\nexport class DialogHandler {\n    constructor(\n        private actions$: Actions,\n        private dialog: Modal,\n        private store: Store,\n    ) {\n        this.actions$.pipe(ofActionDispatched(OpenDialog))\n            .subscribe((action: OpenDialog) => {\n                this.dialog.open(action.dialog, action.data, action.config);\n            });\n\n        this.actions$.pipe(ofActionDispatched(OpenConfirmDialog))\n            .subscribe((action: OpenConfirmDialog) => {\n                this.openConfirmDialog(action);\n            });\n    }\n\n    private openConfirmDialog(action: OpenConfirmDialog) {\n        this.dialog.open(ConfirmModalComponent, action.data)\n            .beforeClosed()\n            .subscribe(confirmed => {\n                if ( ! confirmed) return;\n                return this.store.dispatch(action.confirmAction);\n            });\n    }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SharingPermissionsButtonComponent } from './sharing-permissions-button/sharing-permissions-button.component';\nimport { ShareDialogComponent } from './share-dialog/share-dialog.component';\nimport { EntriesAccessTableComponent } from './entries-access-table/entries-access-table.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { LinkOptionsComponent } from './links/link-options/link-options.component';\nimport { ShareLinkDialogComponent } from './share-link-dialog/share-link-dialog.component';\nimport { NoSharedEntriesComponent } from './no-shared-entries/no-shared-entries.component';\nimport { TranslationsModule } from '@common/core/translations/translations.module';\nimport { LoadingIndicatorModule } from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport { Modal } from '@common/core/ui/dialogs/modal.service';\nimport { ChipsModule } from '@common/core/ui/chips/chips.module';\nimport {SvgImageModule} from '../../../common/core/ui/svg-image/svg-image.module';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        ReactiveFormsModule,\n        TranslationsModule,\n        LoadingIndicatorModule,\n\n        // material\n        MatSlideToggleModule,\n        MatTabsModule,\n        MatDialogModule,\n        ChipsModule,\n        MatIconModule,\n        MatMenuModule,\n        MatButtonModule,\n        MatTooltipModule,\n        MatCheckboxModule,\n        SvgImageModule,\n    ],\n    declarations: [\n        ShareDialogComponent,\n        EntriesAccessTableComponent,\n        SharingPermissionsButtonComponent,\n        LinkOptionsComponent,\n        ShareLinkDialogComponent,\n        NoSharedEntriesComponent,\n    ],\n    exports: [NoSharedEntriesComponent],\n    providers: [Modal],\n})\nexport class SharingModule {}\n","import { Actions, ofActionSuccessful } from '@ngxs/store';\nimport { ReloadPageEntries } from '../actions/commands';\nimport { DriveDomCacheService } from '../../interactions/drive-dom-cache.service';\nimport { Injectable } from \"@angular/core\";\n\n@Injectable()\nexport class ResetScrollHandler {\n    constructor(\n        private actions$: Actions,\n        private domCache: DriveDomCacheService\n    ) {\n        this.actions$.pipe(ofActionSuccessful(ReloadPageEntries))\n            .subscribe(() => {\n                this.domCache.scrollCont.scrollTo({top: 0});\n            });\n    }\n}\n","import { Store } from '@ngxs/store';\nimport { DeselectAllEntries } from '../actions/commands';\nimport { DriveState } from '../drive-state';\nimport { filter } from 'rxjs/operators';\nimport { Injectable } from \"@angular/core\";\n\n@Injectable()\nexport class PageChangeHandler {\n    constructor(\n        private store: Store\n    ) {\n        this.store.select(DriveState.activePage)\n            .pipe(filter(page => !!page))\n            .subscribe(() => {\n                this.store.dispatch(new DeselectAllEntries());\n            });\n    }\n}\n","import { Actions, ofActionSuccessful, Store } from '@ngxs/store';\nimport { RouterNavigation, RouterState } from '@ngxs/router-plugin';\nimport {\n    FolderPageOpened,\n    RecentEntriesPageOpened,\n    SearchPageOpened,\n    SharesFolderOpened,\n    StarredPageOpened,\n    TrashPageOpened, WorkspacesIndexPageOpened,\n} from '../actions/events';\nimport { DRIVE_PAGE_NAMES } from '../models/drive-page';\nimport { filter } from 'rxjs/operators';\nimport { CurrentUser } from '@common/auth/current-user';\nimport { Injectable } from '@angular/core';\n\nconst LINK_PREVIEW_PAGE = 's';\n\n@Injectable()\nexport class PageLoadHandler {\n    constructor(\n        private store: Store,\n        private actions$: Actions,\n        private currentUser: CurrentUser,\n    ) {\n        this.actions$\n            .pipe(\n                ofActionSuccessful(RouterNavigation),\n                filter((action: RouterNavigation) => action.event.urlAfterRedirects.indexOf('drive') > -1),\n                filter(() => this.currentUser.isLoggedIn()),\n            )\n            .subscribe(() => {\n                const action = this.getPageLoadAction();\n                if (action) this.store.dispatch(action);\n            });\n    }\n\n    private getPageLoadAction() {\n        const params = this.getPageUriParams();\n        switch (params.pageName) {\n            case DRIVE_PAGE_NAMES.RECENT:\n                return new RecentEntriesPageOpened();\n            case DRIVE_PAGE_NAMES.TRASH:\n                return new TrashPageOpened();\n            case DRIVE_PAGE_NAMES.SHARES:\n                return new SharesFolderOpened();\n            case DRIVE_PAGE_NAMES.STARRED:\n                return new StarredPageOpened();\n            case DRIVE_PAGE_NAMES.SEARCH:\n                const state = this.store.selectSnapshot(RouterState.state);\n                const search = state.root.firstChild.queryParams;\n                return new SearchPageOpened({filters: search.filters, query: search.query});\n            case DRIVE_PAGE_NAMES.WORKSPACES:\n                return new WorkspacesIndexPageOpened();\n            case LINK_PREVIEW_PAGE:\n                return null;\n            default:\n                return new FolderPageOpened(params.folderHash);\n        }\n    }\n\n    private getPageUriParams() {\n        // remove query params\n        const uri = this.store.selectSnapshot(RouterState.url).split('?')[0];\n        const [, pageName, folderHash] = uri.split('/').filter(x => !!x);\n        return {pageName, folderHash};\n    }\n}\n","import { Actions, ofActionSuccessful, Store } from '@ngxs/store';\nimport { RemoveEntries, RemoveStar } from '../actions/commands';\nimport { filter } from 'rxjs/operators';\nimport { DriveState } from '../drive-state';\nimport { DRIVE_PAGE_NAMES } from '../models/drive-page';\nimport { Injectable } from '@angular/core';\n\n@Injectable()\nexport class RemoveStarHandler {\n    constructor(\n        private actions$: Actions,\n        private store: Store\n    ) {\n        this.actions$.pipe(ofActionSuccessful(RemoveStar))\n            .pipe(filter(() => {\n                const name = this.store.selectSnapshot(DriveState.activePage).name;\n                return name === DRIVE_PAGE_NAMES.STARRED;\n            }))\n            .subscribe((action: RemoveStar) => {\n                this.store.dispatch(new RemoveEntries(action.entries));\n            });\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ContextMenuDirective} from '@common/core/ui/context-menu/context-menu.directive';\n\n\n@NgModule({\n    declarations: [\n        ContextMenuDirective,\n    ],\n    imports: [\n        CommonModule\n    ],\n    exports: [\n        ContextMenuDirective,\n    ]\n})\nexport class ContextMenuModule {\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TextPreviewComponent} from './text-preview/text-preview.component';\nimport {AVAILABLE_PREVIEWS, DefaultPreviews} from './available-previews';\nimport {PreviewContainerComponent} from './preview-container/preview-container.component';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {VideoPreviewComponent} from './video-preview/video-preview.component';\nimport {ImagePreviewComponent} from './image-preview/image-preview.component';\nimport {PdfPreviewComponent} from './pdf-preview/pdf-preview.component';\nimport {DefaultPreviewComponent} from './default-preview/default-preview.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {AudioPreviewComponent} from './audio-preview/audio-preview.component';\nimport {GoogleDocsViewerComponent} from './google-docs-viewer/google-docs-viewer.component';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {PreviewFilesService} from '@common/file-preview/preview-files.service';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\n\n@NgModule({\n    imports: [\n        CommonModule,\n        TranslationsModule,\n\n        // material\n        PortalModule,\n        MatButtonModule,\n        LoadingIndicatorModule,\n    ],\n    exports: [\n        PreviewContainerComponent,\n    ],\n    declarations: [\n        PreviewContainerComponent,\n        TextPreviewComponent,\n        VideoPreviewComponent,\n        ImagePreviewComponent,\n        PdfPreviewComponent,\n        DefaultPreviewComponent,\n        AudioPreviewComponent,\n        GoogleDocsViewerComponent\n    ],\n    providers: [\n        OverlayPanel,\n        PreviewFilesService,\n        {provide: AVAILABLE_PREVIEWS, useClass: DefaultPreviews},\n    ]\n})\nexport class FilePreviewModule {\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 {Injector, NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {DriveRoutingModule} from './drive-routing.module';\nimport {DriveComponent} from './drive.component';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatProgressBarModule} from '@angular/material/progress-bar';\nimport {MatProgressSpinnerModule} from '@angular/material/progress-spinner';\nimport {MatSidenavModule} from '@angular/material/sidenav';\nimport {MatTabsModule} from '@angular/material/tabs';\nimport {MatTooltipModule} from '@angular/material/tooltip';\nimport {MatTreeModule} from '@angular/material/tree';\nimport {SidebarComponent} from './sidebar/sidebar.component';\nimport {FoldersTreeComponent} from './sidebar/folders-tree/folders-tree.component';\nimport {FilesGridComponent} from './files/components/files-grid/files-grid.component';\nimport {FileThumbnailComponent} from './files/components/file-thumbnail/file-thumbnail.component';\nimport {FilesGridItemComponent} from './files/components/files-grid/files-grid-item/files-grid-item.component';\nimport {DriveHammerInteractionsDirective} from './interactions/drive-hammer-interactions.directive';\nimport {FileIconComponent} from './files/components/file-icon/file-icon.component';\nimport {DRIVE_CONTEXT_MENUS} from './context-actions/drive-context-menus';\nimport {DriveContextMenuComponent} from './context-actions/components/drive-context-menu/drive-context-menu.component';\nimport {SidebarActionButtonsComponent} from './sidebar/sidebar-action-buttons/sidebar-action-buttons.component';\nimport {CrupdateFolderDialogComponent} from './folders/components/crupdate-folder-dialog/crupdate-folder-dialog.component';\nimport {RenameEntryDialogComponent} from './entries/rename-entry-dialog/rename-entry-dialog.component';\nimport {EntryDragPreviewComponent} from './interactions/entry-drag-preview/entry-drag-preview.component';\nimport {EntryBreadcrumbsComponent} from './drive-toolbar/entry-breadcrumbs/entry-breadcrumbs.component';\nimport {UploadsPanelComponent} from './uploads/uploads-panel/uploads-panel.component';\nimport {MoveEntriesDialogComponent} from './entries/move-entries-dialog/move-entries-dialog.component';\nimport {FolderDropTargetDirective} from './interactions/drop-targets/folder-drop-target.directive';\nimport {DriveToolbarComponent} from './drive-toolbar/drive-toolbar.component';\nimport {ToolbarActionsComponent} from './drive-toolbar/toolbar-actions/toolbar-actions.component';\nimport {MainSearchbarComponent} from './search/main-searchbar.component';\nimport {UploadDropzoneComponent} from './uploads/upload-dropzone/upload-dropzone.component';\nimport {EntriesContainerComponent} from './entries/entries-container/entries-container.component';\nimport {DetailsPanelComponent} from './details-sidebar/details-panel/details-panel.component';\nimport {FilePreviewOverlayComponent} from './preview/file-preview-overlay/file-preview-overlay.component';\nimport {FilePreviewToolbarComponent} from './preview/file-preview-overlay/file-preview-toolbar/file-preview-toolbar.component';\nimport {OverlayHandler} from './state/handlers/overlay-handler';\nimport {DownloadHandler} from './state/handlers/donwlod-handler';\nimport {ToastHandler} from './state/handlers/toast-handler';\nimport {UploadPanelHandler} from './state/handlers/upload-panel-handler';\nimport {DialogHandler} from './state/handlers/dialog-handler';\nimport {SharingModule} from './sharing/sharing.module';\nimport {DetailsSidebarComponent} from './details-sidebar/details-sidebar.component';\nimport {FileListHeaderComponent} from './header/file-list-header/file-list-header.component';\nimport {DriveInfiniteScrollDirective} from './interactions/drive-infinite-scroll.directive';\nimport {ResetScrollHandler} from './state/handlers/reset-scroll-handler';\nimport {FilesListComponent} from './files/components/files-list/files-list.component';\nimport {ToggleSelectedClassDirective} from './interactions/toggle-selected-class.directive';\nimport {PageChangeHandler} from './state/handlers/page-change-handler';\nimport {PageLoadHandler} from './state/handlers/page-load-handler';\nimport {RemoveStarHandler} from './state/handlers/remove-star-handler';\nimport {NoFolderEntriesComponent} from './messages/no-folder-entries/no-folder-entries.component';\nimport {NoTrashedEntriesComponent} from './messages/no-trashed-entries/no-trashed-entries.component';\nimport {NoStarredEntriesComponent} from './messages/no-starred-entries/no-starred-entries.component';\nimport {NoRecentEntriesComponent} from './messages/no-recent-entries/no-recent-entries.component';\nimport {UploadsPanelItemComponent} from './uploads/uploads-panel/uploads-panel-item/uploads-panel-item.component';\nimport {NgxsModule} from '@ngxs/store';\nimport {ShareDialogState} from './sharing/state/share-dialog.state';\nimport {ShareLinkState} from './sharing/links/share-link.state';\nimport {DriveState} from './state/drive-state';\nimport {AvailableSpaceIndicatorComponent} from './sidebar/available-space-indicator/available-space-indicator.component';\nimport {LoadingToastComponent} from './messages/loading-toast/loading-toast.component';\nimport {LinkPreviewContainerComponent} from './preview/link-preview-container/link-preview-container.component';\nimport {LinkPreviewPasswordPanelComponent} from './preview/link-preview-container/link-preview-password-panel/link-preview-password-panel.component';\nimport {ContextActionsContainerComponent} from './context-actions/components/context-actions-container/context-actions-container.component';\nimport {DRIVE_UPLOAD_INPUT_CONFIG} from './upload-input-config';\nimport {NoSearchEntriesComponent} from './messages/no-search-entries/no-search-entries.component';\nimport {EntryDescriptionPanelComponent} from './details-sidebar/details-panel/entry-description-panel/entry-description-panel.component';\nimport {FolderPreviewComponent} from './preview/folder-preview/folder-preview.component';\nimport {EntriesSortButtonComponent} from './header/entries-sort-button/entries-sort-button.component';\nimport {MaterialNavbarModule} from '@common/core/ui/material-navbar/material-navbar.module';\nimport {MatMenuModule} from '@angular/material/menu';\nimport {TranslationsModule} from '@common/core/translations/translations.module';\nimport {FormatPipesModule} from '@common/core/ui/format-pipes/format-pipes.module';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {NoResultsMessageModule} from '@common/core/ui/no-results-message/no-results-message.module';\nimport {LoadingIndicatorModule} from '@common/core/ui/loading-indicator/loading-indicator.module';\nimport {ContextMenuModule} from '@common/core/ui/context-menu/context-menu.module';\nimport {AdHostModule} from '@common/core/ui/ad-host/ad-host.module';\nimport {FilePreviewModule} from '@common/file-preview/file-preview.module';\nimport {AVAILABLE_CONTEXT_MENUS} from '@common/core/ui/context-menu/available-context-menus';\nimport {UploadsModule} from '@common/uploads/uploads.module';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {PreviewFilesService} from '@common/file-preview/preview-files.service';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\nimport {UploadInputConfig} from '@common/uploads/upload-input-config';\nimport {Settings} from '../../common/core/config/settings.service';\nimport {WorkspaceSelectorModule} from '../../common/workspaces/workspace-selector/workspace-selector.module';\nimport {SkeletonModule} from '../../common/core/ui/skeleton/skeleton.module';\nimport {\n    WORKSPACE_CONFIG,\n    WorkspaceConfig,\n} from '../../common/workspaces/workspace-config';\nimport {DatatableModule} from '../../common/datatable/datatable.module';\nimport {SearchInputWithFiltersModule} from '../../common/datatable/datatable-filters/search-input-with-filters/search-input-with-filters.module';\nimport {SvgImageModule} from '../../common/core/ui/svg-image/svg-image.module';\n\nexport const STATE_HANDLERS = [\n    OverlayHandler,\n    DownloadHandler,\n    ToastHandler,\n    UploadPanelHandler,\n    DialogHandler,\n    ResetScrollHandler,\n    PageChangeHandler,\n    PageLoadHandler,\n    RemoveStarHandler,\n];\n\n@NgModule({\n    imports: [\n        CommonModule,\n        UploadsModule,\n        DriveRoutingModule,\n        FilePreviewModule,\n        FormsModule,\n        SharingModule,\n        MaterialNavbarModule,\n        TranslationsModule,\n        FormatPipesModule,\n        ReactiveFormsModule,\n        NoResultsMessageModule,\n        LoadingIndicatorModule,\n        ContextMenuModule,\n        AdHostModule,\n        WorkspaceSelectorModule,\n        SkeletonModule,\n        DatatableModule,\n        SearchInputWithFiltersModule,\n        SvgImageModule,\n\n        // material\n        MatSidenavModule,\n        MatTreeModule,\n        MatButtonModule,\n        MatDialogModule,\n        MatProgressBarModule,\n        MatIconModule,\n        MatTooltipModule,\n        MatTabsModule,\n        MatProgressSpinnerModule,\n        MatMenuModule,\n\n        // state\n        NgxsModule.forFeature([\n            DriveState,\n            ShareDialogState,\n            ShareLinkState,\n        ]),\n    ],\n    declarations: [\n        DriveComponent,\n        SidebarComponent,\n        FoldersTreeComponent,\n        FilesGridComponent,\n        FileThumbnailComponent,\n        DriveHammerInteractionsDirective,\n        FilesGridItemComponent,\n        FileIconComponent,\n        DriveContextMenuComponent,\n        SidebarActionButtonsComponent,\n        CrupdateFolderDialogComponent,\n        RenameEntryDialogComponent,\n        EntryDragPreviewComponent,\n        DriveToolbarComponent,\n        EntryBreadcrumbsComponent,\n        UploadsPanelComponent,\n        MoveEntriesDialogComponent,\n        FolderDropTargetDirective,\n        ToolbarActionsComponent,\n        MainSearchbarComponent,\n        UploadDropzoneComponent,\n        NoFolderEntriesComponent,\n        NoTrashedEntriesComponent,\n        NoStarredEntriesComponent,\n        NoRecentEntriesComponent,\n        NoSearchEntriesComponent,\n        EntriesContainerComponent,\n        DetailsSidebarComponent,\n        DetailsPanelComponent,\n        FilePreviewOverlayComponent,\n        FilePreviewToolbarComponent,\n        FileListHeaderComponent,\n        DriveInfiniteScrollDirective,\n        FilesListComponent,\n        ToggleSelectedClassDirective,\n        UploadsPanelItemComponent,\n        AvailableSpaceIndicatorComponent,\n        LoadingToastComponent,\n        LinkPreviewContainerComponent,\n        LinkPreviewPasswordPanelComponent,\n        ContextActionsContainerComponent,\n        EntryDescriptionPanelComponent,\n        FolderPreviewComponent,\n        EntriesSortButtonComponent,\n    ],\n    providers: [\n        // fix angular lazy loaded entry components issue\n        OverlayPanel,\n        PreviewFilesService,\n        Toast,\n\n        // handlers\n        ...STATE_HANDLERS,\n        {\n            provide: AVAILABLE_CONTEXT_MENUS,\n            useValue: DRIVE_CONTEXT_MENUS,\n            multi: true,\n        },\n        {\n            provide: DRIVE_UPLOAD_INPUT_CONFIG,\n            deps: [Settings],\n            useFactory: (settings) => {\n                const uploadInputConfig: UploadInputConfig = {multiple: true};\n\n                const extensions = settings.getJson('drive.validation.allowed_extensions');\n                if (extensions) {\n                    uploadInputConfig.extensions = extensions.map(ext => '.' + ext);\n                }\n\n                return uploadInputConfig;\n            },\n        },\n        {\n            provide: WORKSPACE_CONFIG,\n            useValue: {\n                description: 'Workspaces are shared spaces where teams can store, share and collaborate on files and folders.',\n            } as WorkspaceConfig\n        }\n    ]\n})\nexport class DriveModule {\n    constructor(private injector: Injector) {\n        STATE_HANDLERS.forEach(handler => this.injector.get(handler));\n    }\n}\n","import {\n    DatatableFilter,\n    FilterControlType,\n} from '@common/datatable/datatable-filters/search-input-with-filters/filter-config/datatable-filter';\nimport { CreatedAtFilter, UpdatedAtFilter } 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 FILE_ENTRY_TYPE_FILTER = new DatatableFilter({\n    type: FilterControlType.Select,\n    key: 'type',\n    description: 'Type of the file',\n    defaultValue: 'text',\n    options: [\n        {key: 'Text', value: 'text'},\n        {key: 'Audio', value: 'audio'},\n        {key: 'Video', value: 'video'},\n        {key: 'Image', value: 'image'},\n        {key: 'PDF', value: 'pdf'},\n        {key: 'Spreadsheet', value: 'spreadsheet'},\n        {key: 'Word Document', value: 'word'},\n        {key: 'Photoshop', value: 'photoshop'},\n        {key: 'Archive', value: 'archive'},\n        {key: 'Folder', value: 'folder'},\n    ],\n});\n\nexport const FILE_ENTRY_INDEX_FILTERS: DatatableFilter[] = [\n    FILE_ENTRY_TYPE_FILTER,\n    new DatatableFilter({\n        type: FilterControlType.Select,\n        key: 'public',\n        label: 'status',\n        defaultValue: false,\n        description: 'Whether file is publicly accessible',\n        options: [\n            {key: 'Private', value: false},\n            {key: 'Public', value: true},\n        ],\n    }),\n    new CreatedAtFilter({\n        description: 'Date file was uploaded',\n    }),\n    new UpdatedAtFilter({\n        description: 'Date file was last changed',\n    }),\n    new DatatableFilter({\n        type: FilterControlType.SelectModel,\n        key: 'owner_id',\n        label: 'Uploader',\n        description: 'User that this file was uploaded by',\n        component: FindUserModalComponent,\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","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","<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 {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","import {ChangeDetectionStrategy, Component, HostBinding, Input} from '@angular/core';\nimport {ThemeService} from '../../theme.service';\n\n@Component({\n    selector: 'skeleton',\n    templateUrl: './skeleton.component.html',\n    styleUrls: ['./skeleton.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    host: {\n        'aria-busy': 'true',\n        'aria-valuemin': '0',\n        'aria-valuemax': '100',\n        'aria-valuetext': 'Loading...',\n        'role': 'progressbar',\n    }\n})\nexport class SkeletonComponent {\n    @Input() animation: 'pulsate' | 'wave' = 'wave';\n    @Input() variant: 'avatar' | 'text' | 'rect' | 'icon' = 'text';\n    @HostBinding('class.dark') dark = this.theme.isDarkMode();\n\n    @HostBinding('class.pulsate') get pulsate() {\n        return this.animation === 'pulsate';\n    }\n\n    @HostBinding('class.wave') get wave() {\n        return this.animation === 'wave';\n    }\n\n    @HostBinding('class.avatar') get avatar() {\n        return this.variant === 'avatar';\n    }\n\n    @HostBinding('class.text') get text() {\n        return this.variant === 'text';\n    }\n\n    @HostBinding('class.rect') get rect() {\n        return this.variant === 'rect';\n    }\n\n    @HostBinding('class.icon') get icon() {\n        return this.variant === 'icon';\n    }\n\n    constructor(private theme: ThemeService) {}\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {SkeletonComponent} from './skeleton.component';\n\n@NgModule({\n    declarations: [\n        SkeletonComponent,\n    ],\n    imports: [\n        CommonModule\n    ],\n    exports: [\n        SkeletonComponent,\n    ]\n})\nexport class SkeletonModule {\n}\n","export function hasKey<K extends string>(key: K, val: any): val is {[P in K]: any} {\n    return key in val;\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 {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=\"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","<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 {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","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 {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 {\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","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","import { Pipe, PipeTransform } from '@angular/core';\nimport { prettyBytes } from '../core/utils/pretty-bytes';\n\n@Pipe({\n    name: 'formattedFileSize',\n    pure: true,\n})\nexport class FormattedFileSizePipe implements PipeTransform {\n    transform(bytes: number = 0, precision?: number|string): string {\n        if (isNaN(parseFloat(String(bytes))) || ! isFinite(bytes)) return '-';\n        return prettyBytes(bytes, precision);\n    }\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 { 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","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","/**\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 { 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 { InjectionToken } from '@angular/core';\n\nexport interface WorkspaceConfig {\n    description: string;\n}\n\nexport const WORKSPACE_CONFIG = new InjectionToken<WorkspaceConfig>('WORKSPACE_CONFIG');\n","import {Injectable} from '@angular/core';\nimport {Workspace} from './types/workspace';\nimport {PaginationParams} from '@common/core/types/pagination/pagination-params';\nimport {PaginatedBackendResponse} from '@common/core/types/pagination/paginated-backend-response';\nimport {BackendResponse} from '@common/core/types/backend-response';\nimport {AppHttpClient} from '@common/core/http/app-http-client.service';\nimport {WorkspaceMember} from './types/workspace-member';\nimport {WorkspaceInvite} from './types/workspace-invite';\nimport {filter, tap} from 'rxjs/operators';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {BehaviorSubject, Subscription} from 'rxjs';\nimport {PaginationResponse} from '@common/core/types/pagination/pagination-response';\nimport {hasKey} from '@common/core/utils/has-key';\nimport {CookieService} from '../core/services/cookie.service';\nimport {NotificationService} from '../notifications/notification-list/notification.service';\nimport {\n    WORKSPACE_INVITE_NOTIF_TYPE,\n    WorkspaceInviteNotif,\n} from './types/workspace-invite-notif';\nimport {Toast} from '../core/ui/toast.service';\nimport {BackendErrorResponse} from '../core/types/backend-error-response';\nimport {DatabaseNotification} from '../notifications/database-notification';\nimport {HttpErrors} from '../core/http/errors/http-errors.enum';\n\nconst PERSONAL_WORKSPACE = {name: 'Default', default: true, id: null};\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class WorkspacesService {\n    static BASE_URI = 'workspace';\n    available$ = new BehaviorSubject<Workspace[]>([PERSONAL_WORKSPACE]);\n    activeId$ = new BehaviorSubject<number>(this.getIdFromCookie());\n    activeWorkspace$ = new BehaviorSubject<Workspace>(this.getIdFromCookie() ? null : PERSONAL_WORKSPACE);\n\n    constructor(\n        private http: AppHttpClient,\n        private currentUser: CurrentUser,\n        private cookie: CookieService,\n        private notifications: NotificationService,\n        private toast: Toast,\n    ) {}\n\n    currentUserCan(permission: string): boolean {\n        const member = this.activeWorkspace$.value?.currentUser;\n        return member && (member.is_owner || member.permissions.findIndex(p => p.name === permission) > -1);\n    }\n\n    select(workspaceId: number) {\n        if (workspaceId !== this.activeId$.value) {\n            this.cookie.set(this.cookieName(), workspaceId);\n            this.activeId$.next(workspaceId);\n        }\n        const workspace = this.available$.value.find(w => w.id === this.activeId$.value);\n        this.activeWorkspace$.next(workspace || this.available$.value[0]);\n    }\n\n    pushAndSelect(workspace: Workspace) {\n        this.available$.next([...this.available$.value, workspace]);\n        this.select(workspace.id);\n    }\n\n    replace(workspace: Workspace) {\n        const workspaces = [...this.available$.value];\n        const i = workspaces.findIndex(w => w.id === workspace.id);\n        if (i) {\n            workspaces[i] = workspace;\n        }\n        this.available$.next(workspaces);\n    }\n\n    remove(ids: number[]) {\n        const workspaces = [...this.available$.value];\n        ids.forEach(id => {\n            const i = workspaces.findIndex(w => w.id === id);\n            if (i) {\n                workspaces.splice(i, 1);\n            }\n        });\n        this.available$.next(workspaces);\n        if (ids.includes(this.activeId$.value)) {\n            this.select(null);\n        }\n    }\n\n    indexUserWorkspaces(): BackendResponse<{workspaces: Workspace[]}> {\n        return this.http.get<{workspaces: Workspace[]}>(`me/${WorkspacesService.BASE_URI}s`)\n            .pipe(tap(response => {\n                this.available$.next([...this.available$.value, ...response.workspaces]);\n                this.select(this.activeId$.value);\n            }));\n    }\n\n    get(workspaceId: number): BackendResponse<{workspace: Workspace}> {\n        return this.http.get(`${WorkspacesService.BASE_URI}/${workspaceId}`);\n    }\n\n    delete(ids: number[]): BackendResponse<unknown> {\n        return this.http.delete(`${WorkspacesService.BASE_URI}/${ids}`)\n            .pipe(tap(() => {\n                this.remove(ids);\n            }));\n    }\n\n    create(payload: Partial<Workspace>): BackendResponse<{workspace: Workspace}> {\n        return this.http.post<{workspace: Workspace}>(`${WorkspacesService.BASE_URI}`, payload)\n            .pipe(tap(response => this.pushAndSelect(response.workspace)));\n    }\n\n    update(id: number, payload: Partial<Workspace>): BackendResponse<{workspace: Workspace}> {\n        return this.http.put<{workspace: Workspace}>(`${WorkspacesService.BASE_URI}/${id}`, payload)\n            .pipe(tap(response => this.replace(response.workspace)));\n    }\n\n    invitePeople(workspaceId: number, params: {emails: string[], roleId: number}): BackendResponse<{invites: WorkspaceInvite[]}> {\n        return this.http.post(`${WorkspacesService.BASE_URI}/${workspaceId}/invite`, params);\n    }\n\n    resendInvite(workspaceId: number, inviteId: string): BackendResponse<{invite: WorkspaceInvite}> {\n        return this.http.post(`${WorkspacesService.BASE_URI}/${workspaceId}/${inviteId}/resend`);\n    }\n\n    deleteMember(workspaceId: number, userId: number): BackendResponse<unknown> {\n        return this.http.delete(`${WorkspacesService.BASE_URI}/${workspaceId}/member/${userId}`)\n            .pipe(tap(() => {\n                if (userId === this.currentUser.get('id')) {\n                    this.remove([workspaceId]);\n                }\n            }));\n    }\n\n    deleteInvite(inviteId: string): BackendResponse<void> {\n        return this.http.delete(`${WorkspacesService.BASE_URI}/invite/${inviteId}`);\n    }\n\n    changeRole(workspaceId: number, member: WorkspaceMember|WorkspaceInvite, roleId: number): BackendResponse<void> {\n        const memberId = hasKey('member_id', member) ? member.member_id : member.id;\n        return this.http.post(`${WorkspacesService.BASE_URI}/${workspaceId}/${member.model_type}/${memberId}/change-role`, {roleId});\n    }\n\n    join(inviteId: string): BackendResponse<{workspace: Workspace}> {\n        return this.http.get(`workspace/join/${inviteId}`);\n    }\n\n    bindToNotificationClick(): Subscription {\n        return this.notifications.clickedOnNotification$\n            .pipe(filter(data => data.notification.type === WORKSPACE_INVITE_NOTIF_TYPE))\n            .subscribe(data => {\n                const inviteId = (data.notification as WorkspaceInviteNotif).data.inviteId;\n                if (data.action.action === 'join') {\n                    this.join(inviteId).subscribe(response => {\n                        this.notifications.delete([data.notification]).subscribe();\n                        this.pushAndSelect(response.workspace);\n                        this.toast.open('Joined workspace.');\n                    }, (err: BackendErrorResponse) => {\n                        this.handleWorkspaceInviteClickError(err, data.notification);\n                    });\n                } else if (data.action.action === 'decline') {\n                    this.deleteInvite(inviteId).subscribe(() => {\n                        this.notifications.delete([data.notification]).subscribe();\n                        this.toast.open('Declined workspace invite.');\n                    }, (err: BackendErrorResponse) => {\n                        this.handleWorkspaceInviteClickError(err, data.notification);\n                    });\n                }\n            });\n    }\n\n    private handleWorkspaceInviteClickError(err: BackendErrorResponse, notif: DatabaseNotification) {\n        if (err.status === 404) {\n            this.notifications.delete([notif]).subscribe();\n            this.toast.open('That invite is no longer valid.');\n        } else {\n            this.toast.open(HttpErrors.Default);\n        }\n    }\n\n    getIdFromCookie() {\n        let workspaceId = this.cookie.get(this.cookieName());\n        workspaceId = typeof workspaceId === 'string' ? parseInt(workspaceId) : workspaceId;\n        return isNaN(workspaceId) ? null : workspaceId;\n    }\n\n    private cookieName() {\n        return `${this.currentUser.get('id')}_activeWorkspace`;\n    }\n}\n","import { DatabaseNotification, DatabaseNotificationData } from '../../notifications/database-notification';\n\nexport const WORKSPACE_INVITE_NOTIF_TYPE = 'Common\\\\Workspaces\\\\Notifications\\\\WorkspaceInvitation';\n\nexport interface WorkspaceInviteNotif extends DatabaseNotification {\n    data: DatabaseNotificationData & {inviteId: string};\n}\n"]}

Zerion Mini Shell 1.0