{"version":3,"file":"iharbeck-ngx-virtual-scroller.mjs","sources":["../../../projects/ngx-virtual-scroller/src/lib/ngx-virtual-scroller.component.ts","../../../projects/ngx-virtual-scroller/src/lib/ngx-virtual-scroller.module.ts","../../../projects/ngx-virtual-scroller/src/public-api.ts","../../../projects/ngx-virtual-scroller/src/iharbeck-ngx-virtual-scroller.ts"],"sourcesContent":["import {\n    ChangeDetectorRef,\n    Component,\n    ContentChild,\n    ElementRef,\n    EventEmitter,\n    Inject,\n    Input,\n    NgModule,\n    NgZone,\n    OnChanges,\n    OnDestroy,\n    OnInit,\n    Optional,\n    Output,\n    Renderer2,\n    ViewChild,\n} from '@angular/core';\n\nimport {PLATFORM_ID} from '@angular/core';\nimport {isPlatformServer} from '@angular/common';\n\nimport {CommonModule} from '@angular/common';\n\nimport * as tween from '@tweenjs/tween.js'\n\nexport interface VirtualScrollerDefaultOptions {\n    checkResizeInterval: number\n    modifyOverflowStyleOfParentScroll: boolean,\n    resizeBypassRefreshThreshold: number,\n    scrollAnimationTime: number;\n    scrollDebounceTime: number;\n    scrollThrottlingTime: number;\n    scrollbarHeight?: number;\n    scrollbarWidth?: number;\n    stripedTable: boolean\n}\n\nexport function VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY(): VirtualScrollerDefaultOptions {\n    return {\n        checkResizeInterval: 1000,\n        modifyOverflowStyleOfParentScroll: true,\n        resizeBypassRefreshThreshold: 5,\n        scrollAnimationTime: 750,\n        scrollDebounceTime: 0,\n        scrollThrottlingTime: 0,\n        stripedTable: false\n    };\n}\n\nexport interface WrapGroupDimensions {\n    maxChildSizePerWrapGroup: WrapGroupDimension[];\n    numberOfKnownWrapGroupChildSizes: number;\n    sumOfKnownWrapGroupChildHeights: number;\n    sumOfKnownWrapGroupChildWidths: number;\n}\n\nexport interface WrapGroupDimension {\n    childHeight: number;\n    childWidth: number;\n    items: any[];\n}\n\nexport interface IDimensions {\n    childHeight: number;\n    childWidth: number;\n    itemCount: number;\n    itemsPerPage: number;\n    itemsPerWrapGroup: number;\n    maxScrollPosition: number;\n    pageCount_fractional: number;\n    scrollLength: number;\n    viewportLength: number;\n    wrapGroupsPerPage: number;\n}\n\nexport interface IPageInfo {\n    endIndex: number;\n    endIndexWithBuffer: number;\n    maxScrollPosition: number;\n    scrollEndPosition: number;\n    scrollStartPosition: number;\n    startIndex: number;\n    startIndexWithBuffer: number;\n}\n\nexport interface IViewport extends IPageInfo {\n    padding: number;\n    scrollLength: number;\n    scrollbarLength: number;\n}\n\n\n@Component({\n    selector: 'virtual-scroller,[virtualScroller]',\n    exportAs: 'virtualScroller',\n    template: `\n        <div class=\"total-padding\" #invisiblePadding></div>\n        <div class=\"scrollable-content\" #content>\n            <ng-content></ng-content>\n        </div>\n    `,\n    host: {\n        '[class.horizontal]': 'horizontal',\n        '[class.vertical]': '!horizontal',\n        '[class.selfScroll]': '!parentScroll',\n        '[class.rtl]': 'RTL'\n    },\n    styles: [`\n        :host {\n            position: relative;\n            display: block;\n            -webkit-overflow-scrolling: touch;\n        }\n\n        :host.horizontal.selfScroll {\n            overflow-y: visible;\n            overflow-x: auto;\n        }\n\n        :host.horizontal.selfScroll.rtl {\n            transform: scaleX(-1);\n        }\n\n        :host.vertical.selfScroll {\n            overflow-y: auto;\n            overflow-x: visible;\n        }\n\n        .scrollable-content {\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            max-width: 100vw;\n            max-height: 100vh;\n            position: absolute;\n        }\n\n        .scrollable-content ::ng-deep > * {\n            box-sizing: border-box;\n        }\n\n        :host.horizontal {\n            white-space: nowrap;\n        }\n\n        :host.horizontal .scrollable-content {\n            display: flex;\n        }\n\n        :host.horizontal .scrollable-content ::ng-deep > * {\n            flex-shrink: 0;\n            flex-grow: 0;\n            white-space: initial;\n        }\n\n        :host.horizontal.rtl .scrollable-content ::ng-deep > * {\n            transform: scaleX(-1);\n        }\n\n        .total-padding {\n            width: 1px;\n            opacity: 0;\n        }\n\n        :host.horizontal .total-padding {\n            height: 100%;\n        }\n    `],\n    standalone: false\n})\nexport class VirtualScrollerComponent implements OnInit, OnChanges, OnDestroy {\n    public viewPortItems: any[];\n    public window = window;\n\n    public get viewPortInfo(): IPageInfo {\n        let pageInfo: IViewport = this.previousViewPort || <any>{};\n        return {\n            startIndex: pageInfo.startIndex || 0,\n            endIndex: pageInfo.endIndex || 0,\n            scrollStartPosition: pageInfo.scrollStartPosition || 0,\n            scrollEndPosition: pageInfo.scrollEndPosition || 0,\n            maxScrollPosition: pageInfo.maxScrollPosition || 0,\n            startIndexWithBuffer: pageInfo.startIndexWithBuffer || 0,\n            endIndexWithBuffer: pageInfo.endIndexWithBuffer || 0\n        };\n    }\n\n    @Input()\n    public executeRefreshOutsideAngularZone: boolean = false;\n\n    protected _enableUnequalChildrenSizes: boolean = false;\n    @Input()\n    public get enableUnequalChildrenSizes(): boolean {\n        return this._enableUnequalChildrenSizes;\n    }\n\n    public set enableUnequalChildrenSizes(value: boolean) {\n        if (this._enableUnequalChildrenSizes === value) {\n            return;\n        }\n\n        this._enableUnequalChildrenSizes = value;\n        this.minMeasuredChildWidth = undefined;\n        this.minMeasuredChildHeight = undefined;\n    }\n\n    @Input()\n    public RTL: boolean = false;\n\n    @Input()\n    public useMarginInsteadOfTranslate: boolean = false;\n\n    @Input()\n    public modifyOverflowStyleOfParentScroll: boolean;\n\n    @Input()\n    public stripedTable: boolean;\n\n    @Input()\n    public scrollbarWidth: number;\n\n    @Input()\n    public scrollbarHeight: number;\n\n    @Input()\n    public childWidth: number;\n\n    @Input()\n    public childHeight: number;\n\n    @Input()\n    public ssrChildWidth: number;\n\n    @Input()\n    public ssrChildHeight: number;\n\n    @Input()\n    public ssrViewportWidth: number = 1920;\n\n    @Input()\n    public ssrViewportHeight: number = 1080;\n\n    protected _bufferAmount: number;\n    @Input()\n    public get bufferAmount(): number {\n        if (typeof (this._bufferAmount) === 'number' && this._bufferAmount >= 0) {\n            return this._bufferAmount;\n        } else {\n            return this.enableUnequalChildrenSizes ? 5 : 0;\n        }\n    }\n\n    public set bufferAmount(value: number) {\n        this._bufferAmount = value;\n    }\n\n    @Input()\n    public scrollAnimationTime: number;\n\n    @Input()\n    public resizeBypassRefreshThreshold: number;\n\n    protected _scrollThrottlingTime: number;\n    @Input()\n    public get scrollThrottlingTime(): number {\n        return this._scrollThrottlingTime;\n    }\n\n    public set scrollThrottlingTime(value: number) {\n        this._scrollThrottlingTime = value;\n        this.updateOnScrollFunction();\n    }\n\n    protected _scrollDebounceTime: number;\n    @Input()\n    public get scrollDebounceTime(): number {\n        return this._scrollDebounceTime;\n    }\n\n    public set scrollDebounceTime(value: number) {\n        this._scrollDebounceTime = value;\n        this.updateOnScrollFunction();\n    }\n\n    protected onScroll: () => void;\n\n    protected updateOnScrollFunction(): void {\n        if (this.scrollDebounceTime) {\n            this.onScroll = <any>this.debounce(() => {\n                this.refresh_internal(false);\n            }, this.scrollDebounceTime);\n        } else if (this.scrollThrottlingTime) {\n            this.onScroll = <any>this.throttleTrailing(() => {\n                this.refresh_internal(false);\n            }, this.scrollThrottlingTime);\n        } else {\n            this.onScroll = () => {\n                this.refresh_internal(false);\n            };\n        }\n    }\n\n    protected checkScrollElementResizedTimer: number;\n    protected _checkResizeInterval: number;\n    @Input()\n    public get checkResizeInterval(): number {\n        return this._checkResizeInterval;\n    }\n\n    public set checkResizeInterval(value: number) {\n        if (this._checkResizeInterval === value) {\n            return;\n        }\n\n        this._checkResizeInterval = value;\n        this.addScrollEventHandlers();\n    }\n\n    protected _items: any[] = [];\n    @Input()\n    public get items(): any[] {\n        return this._items;\n    }\n\n    public set items(value: any[]) {\n        if (value === this._items) {\n            return;\n        }\n\n        this._items = value || [];\n        this.refresh_internal(true);\n    }\n\n    @Input()\n    public compareItems: (item1: any, item2: any) => boolean = (item1: any, item2: any) => item1 === item2;\n\n    protected _horizontal: boolean;\n    @Input()\n    public get horizontal(): boolean {\n        return this._horizontal;\n    }\n\n    public set horizontal(value: boolean) {\n        this._horizontal = value;\n        this.updateDirection();\n    }\n\n    protected revertParentOverscroll(): void {\n        const scrollElement = this.getScrollElement();\n        if (scrollElement && this.oldParentScrollOverflow) {\n            scrollElement.style['overflow-y'] = this.oldParentScrollOverflow.y;\n            scrollElement.style['overflow-x'] = this.oldParentScrollOverflow.x;\n        }\n\n        this.oldParentScrollOverflow = undefined;\n    }\n\n    protected oldParentScrollOverflow: { x: string, y: string };\n    protected _parentScroll: Element | Window;\n    @Input()\n    public get parentScroll(): Element | Window {\n        return this._parentScroll;\n    }\n\n    public set parentScroll(value: Element | Window) {\n        if (this._parentScroll === value) {\n            return;\n        }\n\n        this.revertParentOverscroll();\n        this._parentScroll = value;\n        this.addScrollEventHandlers();\n\n        const scrollElement = this.getScrollElement();\n        if (this.modifyOverflowStyleOfParentScroll && scrollElement !== this.element.nativeElement) {\n            this.oldParentScrollOverflow = {x: scrollElement.style['overflow-x'], y: scrollElement.style['overflow-y']};\n            scrollElement.style['overflow-y'] = this.horizontal ? 'visible' : 'auto';\n            scrollElement.style['overflow-x'] = this.horizontal ? 'auto' : 'visible';\n        }\n    }\n\n    @Output()\n    public vsUpdate: EventEmitter<any[]> = new EventEmitter<any[]>();\n\n    @Output()\n    public vsChange: EventEmitter<IPageInfo> = new EventEmitter<IPageInfo>();\n\n    @Output()\n    public vsStart: EventEmitter<IPageInfo> = new EventEmitter<IPageInfo>();\n\n    @Output()\n    public vsEnd: EventEmitter<IPageInfo> = new EventEmitter<IPageInfo>();\n\n    @ViewChild('content', {read: ElementRef, static: true})\n    protected contentElementRef: ElementRef;\n\n    @ViewChild('invisiblePadding', {read: ElementRef, static: true})\n    protected invisiblePaddingElementRef: ElementRef;\n\n    @ContentChild('header', {read: ElementRef, static: false})\n    protected headerElementRef: ElementRef;\n\n    @ContentChild('container', {read: ElementRef, static: false})\n    protected containerElementRef: ElementRef;\n\n    public ngOnInit(): void {\n        this.addScrollEventHandlers();\n    }\n\n    public ngOnDestroy(): void {\n        this.removeScrollEventHandlers();\n        this.revertParentOverscroll();\n    }\n\n    public ngOnChanges(changes: any): void {\n        let indexLengthChanged = this.cachedItemsLength !== this.items.length;\n        this.cachedItemsLength = this.items.length;\n\n        const firstRun: boolean = !changes.items || !changes.items.previousValue || changes.items.previousValue.length === 0;\n        this.refresh_internal(indexLengthChanged || firstRun);\n    }\n\n    public ngDoCheck(): void {\n        if (this.cachedItemsLength !== this.items.length) {\n            this.cachedItemsLength = this.items.length;\n            this.refresh_internal(true);\n            return;\n        }\n\n        if (this.previousViewPort && this.viewPortItems && this.viewPortItems.length > 0) {\n            let itemsArrayChanged = false;\n            for (let i = 0; i < this.viewPortItems.length; ++i) {\n                if (!this.compareItems(this.items[this.previousViewPort.startIndexWithBuffer + i], this.viewPortItems[i])) {\n                    itemsArrayChanged = true;\n                    break;\n                }\n            }\n            if (itemsArrayChanged) {\n                this.refresh_internal(true);\n            }\n        }\n    }\n\n    public refresh(): void {\n        this.refresh_internal(true);\n    }\n\n    public invalidateAllCachedMeasurements(): void {\n        this.wrapGroupDimensions = {\n            maxChildSizePerWrapGroup: [],\n            numberOfKnownWrapGroupChildSizes: 0,\n            sumOfKnownWrapGroupChildWidths: 0,\n            sumOfKnownWrapGroupChildHeights: 0\n        };\n\n        this.minMeasuredChildWidth = undefined;\n        this.minMeasuredChildHeight = undefined;\n\n        this.refresh_internal(false);\n    }\n\n    public invalidateCachedMeasurementForItem(item: any): void {\n        if (this.enableUnequalChildrenSizes) {\n            let index = this.items && this.items.indexOf(item);\n            if (index >= 0) {\n                this.invalidateCachedMeasurementAtIndex(index);\n            }\n        } else {\n            this.minMeasuredChildWidth = undefined;\n            this.minMeasuredChildHeight = undefined;\n        }\n\n        this.refresh_internal(false);\n    }\n\n    public invalidateCachedMeasurementAtIndex(index: number): void {\n        if (this.enableUnequalChildrenSizes) {\n            let cachedMeasurement = this.wrapGroupDimensions.maxChildSizePerWrapGroup[index];\n            if (cachedMeasurement) {\n                this.wrapGroupDimensions.maxChildSizePerWrapGroup[index] = undefined;\n                --this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths -= cachedMeasurement.childWidth || 0;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights -= cachedMeasurement.childHeight || 0;\n            }\n        } else {\n            this.minMeasuredChildWidth = undefined;\n            this.minMeasuredChildHeight = undefined;\n        }\n\n        this.refresh_internal(false);\n    }\n\n    public scrollInto(item: any, alignToBeginning: boolean = true, additionalOffset: number = 0, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        let index: number = this.items.indexOf(item);\n        if (index === -1) {\n            return;\n        }\n\n        this.scrollToIndex(index, alignToBeginning, additionalOffset, animationMilliseconds, animationCompletedCallback);\n    }\n\n    public scrollToIndex(index: number, alignToBeginning: boolean = true, additionalOffset: number = 0, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        let maxRetries: number = 5;\n\n        let retryIfNeeded = () => {\n            --maxRetries;\n            if (maxRetries <= 0) {\n                if (animationCompletedCallback) {\n                    animationCompletedCallback();\n                }\n                return;\n            }\n\n            let dimensions = this.calculateDimensions();\n            let desiredStartIndex = Math.min(Math.max(index, 0), dimensions.itemCount - 1);\n            if (this.previousViewPort.startIndex === desiredStartIndex) {\n                if (animationCompletedCallback) {\n                    animationCompletedCallback();\n                }\n                return;\n            }\n\n            this.scrollToIndex_internal(index, alignToBeginning, additionalOffset, 0, retryIfNeeded);\n        };\n\n        this.scrollToIndex_internal(index, alignToBeginning, additionalOffset, animationMilliseconds, retryIfNeeded);\n    }\n\n    protected scrollToIndex_internal(index: number, alignToBeginning: boolean = true, additionalOffset: number = 0, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        animationMilliseconds = animationMilliseconds === undefined ? this.scrollAnimationTime : animationMilliseconds;\n\n        let dimensions = this.calculateDimensions();\n        let scroll = this.calculatePadding(index, dimensions) + additionalOffset;\n        if (!alignToBeginning) {\n            scroll -= dimensions.wrapGroupsPerPage * dimensions[this._childScrollDim];\n        }\n\n        this.scrollToPosition(scroll, animationMilliseconds, animationCompletedCallback);\n    }\n\n    public scrollToPosition(scrollPosition: number, animationMilliseconds: number = undefined, animationCompletedCallback: () => void = undefined): void {\n        scrollPosition += this.getElementsOffset();\n\n        animationMilliseconds = animationMilliseconds === undefined ? this.scrollAnimationTime : animationMilliseconds;\n\n        let scrollElement = this.getScrollElement();\n\n        let animationRequest: number;\n\n        if (this.currentTween) {\n            this.currentTween.stop();\n            this.currentTween = undefined;\n        }\n\n        if (!animationMilliseconds) {\n            this.renderer.setProperty(scrollElement, this._scrollType, scrollPosition);\n            this.refresh_internal(false, animationCompletedCallback);\n            return;\n        }\n\n        const tweenConfigObj = {scrollPosition: scrollElement[this._scrollType]};\n\n        let newTween = new tween.Tween(tweenConfigObj)\n            .to({scrollPosition}, animationMilliseconds)\n            .easing(tween.Easing.Quadratic.Out)\n            .onUpdate((data) => {\n                if (isNaN(data.scrollPosition)) {\n                    return;\n                }\n                this.renderer.setProperty(scrollElement, this._scrollType, data.scrollPosition);\n                this.refresh_internal(false);\n            })\n            .onStop(() => {\n                cancelAnimationFrame(animationRequest);\n            })\n            .start();\n\n        const animate = (time?: number) => {\n            if (!newTween['isPlaying']()) {\n                return;\n            }\n\n            newTween.update(time);\n            if (tweenConfigObj.scrollPosition === scrollPosition) {\n                this.refresh_internal(false, animationCompletedCallback);\n                return;\n            }\n\n            this.zone.runOutsideAngular(() => {\n                animationRequest = requestAnimationFrame(animate);\n            });\n        };\n\n        animate();\n        this.currentTween = newTween;\n    }\n\n    protected isAngularUniversalSSR: boolean;\n\n    constructor(\n        protected readonly element: ElementRef,\n        protected readonly renderer: Renderer2,\n        protected readonly zone: NgZone,\n        protected changeDetectorRef: ChangeDetectorRef,\n        @Inject(PLATFORM_ID) platformId: Object,\n        @Optional() @Inject('virtual-scroller-default-options')\n            options: VirtualScrollerDefaultOptions\n    ) {\n\n        this.isAngularUniversalSSR = isPlatformServer(platformId);\n\n        this.checkResizeInterval = options.checkResizeInterval;\n        this.modifyOverflowStyleOfParentScroll = options.modifyOverflowStyleOfParentScroll;\n        this.resizeBypassRefreshThreshold = options.resizeBypassRefreshThreshold;\n        this.scrollAnimationTime = options.scrollAnimationTime;\n        this.scrollDebounceTime = options.scrollDebounceTime;\n        this.scrollThrottlingTime = options.scrollThrottlingTime;\n        this.scrollbarHeight = options.scrollbarHeight;\n        this.scrollbarWidth = options.scrollbarWidth;\n        this.stripedTable = options.stripedTable;\n\n        this.horizontal = false;\n        this.resetWrapGroupDimensions();\n    }\n\n    protected getElementSize(element: HTMLElement): any {\n        let result = element.getBoundingClientRect();\n        let styles = getComputedStyle(element);\n        let marginTop = parseInt(styles['margin-top'], 10) || 0;\n        let marginBottom = parseInt(styles['margin-bottom'], 10) || 0;\n        let marginLeft = parseInt(styles['margin-left'], 10) || 0;\n        let marginRight = parseInt(styles['margin-right'], 10) || 0;\n\n        return {\n            top: result.top + marginTop,\n            bottom: result.bottom + marginBottom,\n            left: result.left + marginLeft,\n            right: result.right + marginRight,\n            width: result.width + marginLeft + marginRight,\n            height: result.height + marginTop + marginBottom\n        };\n    }\n\n    protected previousScrollBoundingRect: ClientRect;\n\n    protected checkScrollElementResized(): void {\n        let boundingRect = this.getElementSize(this.getScrollElement());\n\n        let sizeChanged: boolean;\n        if (!this.previousScrollBoundingRect) {\n            sizeChanged = true;\n        } else {\n            let widthChange = Math.abs(boundingRect.width - this.previousScrollBoundingRect.width);\n            let heightChange = Math.abs(boundingRect.height - this.previousScrollBoundingRect.height);\n            sizeChanged = widthChange > this.resizeBypassRefreshThreshold || heightChange > this.resizeBypassRefreshThreshold;\n        }\n\n        if (sizeChanged) {\n            this.previousScrollBoundingRect = boundingRect;\n            if (boundingRect.width > 0 && boundingRect.height > 0) {\n                this.refresh_internal(false);\n            }\n        }\n    }\n\n    protected _invisiblePaddingProperty;\n    protected _offsetType;\n    protected _scrollType;\n    protected _pageOffsetType;\n    protected _childScrollDim;\n    protected _translateDir;\n    protected _marginDir;\n\n    protected updateDirection(): void {\n        if (this.horizontal) {\n            this._childScrollDim = 'childWidth';\n            this._invisiblePaddingProperty = 'width';\n            this._marginDir = 'margin-left';\n            this._offsetType = 'offsetLeft';\n            this._pageOffsetType = 'pageXOffset';\n            this._scrollType = 'scrollLeft';\n            this._translateDir = 'translateX';\n        } else {\n            this._childScrollDim = 'childHeight';\n            this._invisiblePaddingProperty = 'height';\n            this._marginDir = 'margin-top';\n            this._offsetType = 'offsetTop';\n            this._pageOffsetType = 'pageYOffset';\n            this._scrollType = 'scrollTop';\n            this._translateDir = 'translateY';\n        }\n    }\n\n    protected debounce(func: Function, wait: number): Function {\n        const throttled = this.throttleTrailing(func, wait);\n        const result = function () {\n            throttled['cancel']();\n            throttled.apply(this, arguments);\n        };\n        result['cancel'] = function () {\n            throttled['cancel']();\n        };\n\n        return result;\n    }\n\n    protected throttleTrailing(func: Function, wait: number): Function {\n        let timeout = undefined;\n        let _arguments = arguments;\n        const result = function () {\n            const _this = this;\n            _arguments = arguments\n\n            if (timeout) {\n                return;\n            }\n\n            if (wait <= 0) {\n                func.apply(_this, _arguments);\n            } else {\n                timeout = setTimeout(function () {\n                    timeout = undefined;\n                    func.apply(_this, _arguments);\n                }, wait);\n            }\n        };\n        result['cancel'] = function () {\n            if (timeout) {\n                clearTimeout(timeout);\n                timeout = undefined;\n            }\n        };\n\n        return result;\n    }\n\n    protected calculatedScrollbarWidth: number = 0;\n    protected calculatedScrollbarHeight: number = 0;\n\n    protected padding: number = 0;\n    protected previousViewPort: IViewport = <any>{};\n    protected currentTween: tween.Tween<any>;\n    protected cachedItemsLength: number;\n\n    protected disposeScrollHandler: () => void | undefined;\n    protected disposeResizeHandler: () => void | undefined;\n\n    protected refresh_internal(itemsArrayModified: boolean, refreshCompletedCallback: () => void = undefined, maxRunTimes: number = 2): void {\n        //note: maxRunTimes is to force it to keep recalculating if the previous iteration caused a re-render (different sliced items in viewport or scrollPosition changed).\n        //The default of 2x max will probably be accurate enough without causing too large a performance bottleneck\n        //The code would typically quit out on the 2nd iteration anyways. The main time it'd think more than 2 runs would be necessary would be for vastly different sized child items or if this is the 1st time the items array was initialized.\n        //Without maxRunTimes, If the user is actively scrolling this code would become an infinite loop until they stopped scrolling. This would be okay, except each scroll event would start an additional infinte loop. We want to short-circuit it to prevent this.\n\n        if (itemsArrayModified && this.previousViewPort && this.previousViewPort.scrollStartPosition > 0) {\n            //if items were prepended, scroll forward to keep same items visible\n            let oldViewPort = this.previousViewPort;\n            let oldViewPortItems = this.viewPortItems;\n\n            let oldRefreshCompletedCallback = refreshCompletedCallback;\n            refreshCompletedCallback = () => {\n                let scrollLengthDelta = this.previousViewPort.scrollLength - oldViewPort.scrollLength;\n                if (scrollLengthDelta > 0 && this.viewPortItems) {\n                    let oldStartItem = oldViewPortItems[0];\n                    let oldStartItemIndex = this.items.findIndex(x => this.compareItems(oldStartItem, x));\n                    if (oldStartItemIndex > this.previousViewPort.startIndexWithBuffer) {\n                        let itemOrderChanged = false;\n                        for (let i = 1; i < this.viewPortItems.length; ++i) {\n                            if (!this.compareItems(this.items[oldStartItemIndex + i], oldViewPortItems[i])) {\n                                itemOrderChanged = true;\n                                break;\n                            }\n                        }\n\n                        if (!itemOrderChanged) {\n                            this.scrollToPosition(this.previousViewPort.scrollStartPosition + scrollLengthDelta, 0, oldRefreshCompletedCallback);\n                            return;\n                        }\n                    }\n                }\n\n                if (oldRefreshCompletedCallback) {\n                    oldRefreshCompletedCallback();\n                }\n            };\n        }\n\n        this.zone.runOutsideAngular(() => {\n            requestAnimationFrame(() => {\n\n                if (itemsArrayModified) {\n                    this.resetWrapGroupDimensions();\n                }\n                let viewport = this.calculateViewport();\n\n                let startChanged = itemsArrayModified || viewport.startIndex !== this.previousViewPort.startIndex;\n                let endChanged = itemsArrayModified || viewport.endIndex !== this.previousViewPort.endIndex;\n                let scrollbarLengthChanged = viewport.scrollbarLength !== this.previousViewPort.scrollbarLength;\n                let paddingChanged = viewport.padding !== this.previousViewPort.padding;\n                let scrollPositionChanged = viewport.scrollStartPosition !== this.previousViewPort.scrollStartPosition || viewport.scrollEndPosition !== this.previousViewPort.scrollEndPosition || viewport.maxScrollPosition !== this.previousViewPort.maxScrollPosition;\n\n                this.previousViewPort = viewport;\n\n                if (scrollbarLengthChanged) {\n                    this.renderer.setStyle(this.invisiblePaddingElementRef.nativeElement, this._invisiblePaddingProperty, `${viewport.scrollLength}px`);\n                }\n\n                if (paddingChanged) {\n                    if (this.useMarginInsteadOfTranslate) {\n                        this.renderer.setStyle(this.contentElementRef.nativeElement, this._marginDir, `${viewport.padding}px`);\n                    } else {\n                        this.renderer.setStyle(this.contentElementRef.nativeElement, 'transform', `${this._translateDir}(${viewport.padding}px)`);\n                        this.renderer.setStyle(this.contentElementRef.nativeElement, 'webkitTransform', `${this._translateDir}(${viewport.padding}px)`);\n                    }\n                }\n\n                if (this.headerElementRef) {\n                    let scrollPosition = this.getScrollElement()[this._scrollType];\n                    let containerOffset = this.getElementsOffset();\n                    let offset = Math.max(scrollPosition - viewport.padding - containerOffset + this.headerElementRef.nativeElement.clientHeight, 0);\n                    this.renderer.setStyle(this.headerElementRef.nativeElement, 'transform', `${this._translateDir}(${offset}px)`);\n                    this.renderer.setStyle(this.headerElementRef.nativeElement, 'webkitTransform', `${this._translateDir}(${offset}px)`);\n                }\n\n                const changeEventArg: IPageInfo = (startChanged || endChanged) ? {\n                    startIndex: viewport.startIndex,\n                    endIndex: viewport.endIndex,\n                    scrollStartPosition: viewport.scrollStartPosition,\n                    scrollEndPosition: viewport.scrollEndPosition,\n                    startIndexWithBuffer: viewport.startIndexWithBuffer,\n                    endIndexWithBuffer: viewport.endIndexWithBuffer,\n                    maxScrollPosition: viewport.maxScrollPosition\n                } : undefined;\n\n\n                if (startChanged || endChanged || scrollPositionChanged) {\n                    const handleChanged = () => {\n                        // update the scroll list to trigger re-render of components in viewport\n                        this.viewPortItems = viewport.startIndexWithBuffer >= 0 && viewport.endIndexWithBuffer >= 0 ? this.items.slice(viewport.startIndexWithBuffer, viewport.endIndexWithBuffer + 1) : [];\n                        this.vsUpdate.emit(this.viewPortItems);\n\n                        if (startChanged) {\n                            this.vsStart.emit(changeEventArg);\n                        }\n\n                        if (endChanged) {\n                            this.vsEnd.emit(changeEventArg);\n                        }\n\n                        if (startChanged || endChanged) {\n                            this.changeDetectorRef.markForCheck();\n                            this.vsChange.emit(changeEventArg);\n                        }\n\n                        if (maxRunTimes > 0) {\n                            this.refresh_internal(false, refreshCompletedCallback, maxRunTimes - 1);\n                            return;\n                        }\n\n                        if (refreshCompletedCallback) {\n                            refreshCompletedCallback();\n                        }\n                    };\n\n\n                    if (this.executeRefreshOutsideAngularZone) {\n                        handleChanged();\n                    } else {\n                        this.zone.run(handleChanged);\n                    }\n                } else {\n                    if (maxRunTimes > 0 && (scrollbarLengthChanged || paddingChanged)) {\n                        this.refresh_internal(false, refreshCompletedCallback, maxRunTimes - 1);\n                        return;\n                    }\n\n                    if (refreshCompletedCallback) {\n                        refreshCompletedCallback();\n                    }\n                }\n            });\n        });\n    }\n\n    protected getScrollElement(): HTMLElement {\n        return this.parentScroll instanceof Window ? document.scrollingElement || document.documentElement || document.body : this.parentScroll || this.element.nativeElement;\n    }\n\n    protected addScrollEventHandlers(): void {\n        if (this.isAngularUniversalSSR) {\n            return;\n        }\n\n        let scrollElement = this.getScrollElement();\n\n        this.removeScrollEventHandlers();\n\n        this.zone.runOutsideAngular(() => {\n            if (this.parentScroll instanceof Window) {\n                this.disposeScrollHandler = this.renderer.listen('window', 'scroll', this.onScroll);\n                this.disposeResizeHandler = this.renderer.listen('window', 'resize', this.onScroll);\n            } else {\n                this.disposeScrollHandler = this.renderer.listen(scrollElement, 'scroll', this.onScroll);\n                if (this._checkResizeInterval > 0) {\n                    this.checkScrollElementResizedTimer = <any>setInterval(() => {\n                        this.checkScrollElementResized();\n                    }, this._checkResizeInterval);\n                }\n            }\n        });\n    }\n\n    protected removeScrollEventHandlers(): void {\n        if (this.checkScrollElementResizedTimer) {\n            clearInterval(this.checkScrollElementResizedTimer);\n        }\n\n        if (this.disposeScrollHandler) {\n            this.disposeScrollHandler();\n            this.disposeScrollHandler = undefined;\n        }\n\n        if (this.disposeResizeHandler) {\n            this.disposeResizeHandler();\n            this.disposeResizeHandler = undefined;\n        }\n    }\n\n    protected getElementsOffset(): number {\n        if (this.isAngularUniversalSSR) {\n            return 0;\n        }\n\n        let offset = 0;\n\n        if (this.containerElementRef && this.containerElementRef.nativeElement) {\n            offset += this.containerElementRef.nativeElement[this._offsetType];\n        }\n\n        if (this.parentScroll) {\n            let scrollElement = this.getScrollElement();\n            let elementClientRect = this.getElementSize(this.element.nativeElement);\n            let scrollClientRect = this.getElementSize(scrollElement);\n            if (this.horizontal) {\n                offset += elementClientRect.left - scrollClientRect.left;\n            } else {\n                offset += elementClientRect.top - scrollClientRect.top;\n            }\n\n            if (!(this.parentScroll instanceof Window)) {\n                offset += scrollElement[this._scrollType];\n            }\n        }\n\n        return offset;\n    }\n\n    protected countItemsPerWrapGroup(): number {\n        if (this.isAngularUniversalSSR) {\n            return Math.round(this.horizontal ? this.ssrViewportHeight / this.ssrChildHeight : this.ssrViewportWidth / this.ssrChildWidth);\n        }\n\n        let propertyName = this.horizontal ? 'offsetLeft' : 'offsetTop';\n        let children = ((this.containerElementRef && this.containerElementRef.nativeElement) || this.contentElementRef.nativeElement).children;\n\n        let childrenLength = children ? children.length : 0;\n        if (childrenLength === 0) {\n            return 1;\n        }\n\n        let firstOffset = children[0][propertyName];\n        let result = 1;\n        while (result < childrenLength && firstOffset === children[result][propertyName]) {\n            ++result;\n        }\n\n        return result;\n    }\n\n    protected getScrollStartPosition(): number {\n        let windowScrollValue = undefined;\n        if (this.parentScroll instanceof Window) {\n            windowScrollValue = window[this._pageOffsetType];\n        }\n\n        return windowScrollValue || this.getScrollElement()[this._scrollType] || 0;\n    }\n\n    protected minMeasuredChildWidth: number;\n    protected minMeasuredChildHeight: number;\n\n    protected wrapGroupDimensions: WrapGroupDimensions;\n\n    protected resetWrapGroupDimensions(): void {\n        const oldWrapGroupDimensions = this.wrapGroupDimensions;\n        this.invalidateAllCachedMeasurements();\n\n        if (!this.enableUnequalChildrenSizes || !oldWrapGroupDimensions || oldWrapGroupDimensions.numberOfKnownWrapGroupChildSizes === 0) {\n            return;\n        }\n\n        const itemsPerWrapGroup: number = this.countItemsPerWrapGroup();\n        for (let wrapGroupIndex = 0; wrapGroupIndex < oldWrapGroupDimensions.maxChildSizePerWrapGroup.length; ++wrapGroupIndex) {\n            const oldWrapGroupDimension: WrapGroupDimension = oldWrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex];\n            if (!oldWrapGroupDimension || !oldWrapGroupDimension.items || !oldWrapGroupDimension.items.length) {\n                continue;\n            }\n\n            if (oldWrapGroupDimension.items.length !== itemsPerWrapGroup) {\n                return;\n            }\n\n            let itemsChanged = false;\n            let arrayStartIndex = itemsPerWrapGroup * wrapGroupIndex;\n            for (let i = 0; i < itemsPerWrapGroup; ++i) {\n                if (!this.compareItems(oldWrapGroupDimension.items[i], this.items[arrayStartIndex + i])) {\n                    itemsChanged = true;\n                    break;\n                }\n            }\n\n            if (!itemsChanged) {\n                ++this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths += oldWrapGroupDimension.childWidth || 0;\n                this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights += oldWrapGroupDimension.childHeight || 0;\n                this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex] = oldWrapGroupDimension;\n            }\n        }\n    }\n\n    protected calculateDimensions(): IDimensions {\n        let scrollElement = this.getScrollElement();\n\n        const maxCalculatedScrollBarSize: number = 25; // Note: Formula to auto-calculate doesn't work for ParentScroll, so we default to this if not set by consuming application\n        this.calculatedScrollbarHeight = Math.max(Math.min(scrollElement.offsetHeight - scrollElement.clientHeight, maxCalculatedScrollBarSize), this.calculatedScrollbarHeight);\n        this.calculatedScrollbarWidth = Math.max(Math.min(scrollElement.offsetWidth - scrollElement.clientWidth, maxCalculatedScrollBarSize), this.calculatedScrollbarWidth);\n\n        let viewportWidth = scrollElement.offsetWidth - (this.scrollbarWidth || this.calculatedScrollbarWidth || (this.horizontal ? 0 : maxCalculatedScrollBarSize));\n        let viewportHeight = scrollElement.offsetHeight - (this.scrollbarHeight || this.calculatedScrollbarHeight || (this.horizontal ? maxCalculatedScrollBarSize : 0));\n\n        let content = (this.containerElementRef && this.containerElementRef.nativeElement) || this.contentElementRef.nativeElement;\n\n        let itemsPerWrapGroup = this.countItemsPerWrapGroup();\n        let wrapGroupsPerPage;\n\n        let defaultChildWidth;\n        let defaultChildHeight;\n\n        if (this.isAngularUniversalSSR) {\n            viewportWidth = this.ssrViewportWidth;\n            viewportHeight = this.ssrViewportHeight;\n            defaultChildWidth = this.ssrChildWidth;\n            defaultChildHeight = this.ssrChildHeight;\n            let itemsPerRow = Math.max(Math.ceil(viewportWidth / defaultChildWidth), 1);\n            let itemsPerCol = Math.max(Math.ceil(viewportHeight / defaultChildHeight), 1);\n            wrapGroupsPerPage = this.horizontal ? itemsPerRow : itemsPerCol;\n        } else if (!this.enableUnequalChildrenSizes) {\n            if (content.children.length > 0) {\n                if (!this.childWidth || !this.childHeight) {\n                    if (!this.minMeasuredChildWidth && viewportWidth > 0) {\n                        this.minMeasuredChildWidth = viewportWidth;\n                    }\n                    if (!this.minMeasuredChildHeight && viewportHeight > 0) {\n                        this.minMeasuredChildHeight = viewportHeight;\n                    }\n                }\n\n                let child = content.children[0];\n                let clientRect = this.getElementSize(child);\n                this.minMeasuredChildWidth = Math.min(this.minMeasuredChildWidth, clientRect.width);\n                this.minMeasuredChildHeight = Math.min(this.minMeasuredChildHeight, clientRect.height);\n            }\n\n            defaultChildWidth = this.childWidth || this.minMeasuredChildWidth || viewportWidth;\n            defaultChildHeight = this.childHeight || this.minMeasuredChildHeight || viewportHeight;\n            let itemsPerRow = Math.max(Math.ceil(viewportWidth / defaultChildWidth), 1);\n            let itemsPerCol = Math.max(Math.ceil(viewportHeight / defaultChildHeight), 1);\n            wrapGroupsPerPage = this.horizontal ? itemsPerRow : itemsPerCol;\n        } else {\n            let scrollOffset = scrollElement[this._scrollType] - (this.previousViewPort ? this.previousViewPort.padding : 0);\n\n            let arrayStartIndex = this.previousViewPort.startIndexWithBuffer || 0;\n            let wrapGroupIndex = Math.ceil(arrayStartIndex / itemsPerWrapGroup);\n\n            let maxWidthForWrapGroup = 0;\n            let maxHeightForWrapGroup = 0;\n            let sumOfVisibleMaxWidths = 0;\n            let sumOfVisibleMaxHeights = 0;\n            wrapGroupsPerPage = 0;\n\n            for (let i = 0; i < content.children.length; ++i) {\n                ++arrayStartIndex;\n                let child = content.children[i];\n                let clientRect = this.getElementSize(child);\n\n                maxWidthForWrapGroup = Math.max(maxWidthForWrapGroup, clientRect.width);\n                maxHeightForWrapGroup = Math.max(maxHeightForWrapGroup, clientRect.height);\n\n                if (arrayStartIndex % itemsPerWrapGroup === 0) {\n                    let oldValue = this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex];\n                    if (oldValue) {\n                        --this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                        this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths -= oldValue.childWidth || 0;\n                        this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights -= oldValue.childHeight || 0;\n                    }\n\n                    ++this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n                    const items = this.items.slice(arrayStartIndex - itemsPerWrapGroup, arrayStartIndex);\n                    this.wrapGroupDimensions.maxChildSizePerWrapGroup[wrapGroupIndex] = {\n                        childWidth: maxWidthForWrapGroup,\n                        childHeight: maxHeightForWrapGroup,\n                        items: items\n                    };\n                    this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths += maxWidthForWrapGroup;\n                    this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights += maxHeightForWrapGroup;\n\n                    if (this.horizontal) {\n                        let maxVisibleWidthForWrapGroup = Math.min(maxWidthForWrapGroup, Math.max(viewportWidth - sumOfVisibleMaxWidths, 0));\n                        if (scrollOffset > 0) {\n                            let scrollOffsetToRemove = Math.min(scrollOffset, maxVisibleWidthForWrapGroup);\n                            maxVisibleWidthForWrapGroup -= scrollOffsetToRemove;\n                            scrollOffset -= scrollOffsetToRemove;\n                        }\n\n                        sumOfVisibleMaxWidths += maxVisibleWidthForWrapGroup;\n                        if (maxVisibleWidthForWrapGroup > 0 && viewportWidth >= sumOfVisibleMaxWidths) {\n                            ++wrapGroupsPerPage;\n                        }\n                    } else {\n                        let maxVisibleHeightForWrapGroup = Math.min(maxHeightForWrapGroup, Math.max(viewportHeight - sumOfVisibleMaxHeights, 0));\n                        if (scrollOffset > 0) {\n                            let scrollOffsetToRemove = Math.min(scrollOffset, maxVisibleHeightForWrapGroup);\n                            maxVisibleHeightForWrapGroup -= scrollOffsetToRemove;\n                            scrollOffset -= scrollOffsetToRemove;\n                        }\n\n                        sumOfVisibleMaxHeights += maxVisibleHeightForWrapGroup;\n                        if (maxVisibleHeightForWrapGroup > 0 && viewportHeight >= sumOfVisibleMaxHeights) {\n                            ++wrapGroupsPerPage;\n                        }\n                    }\n\n                    ++wrapGroupIndex;\n\n                    maxWidthForWrapGroup = 0;\n                    maxHeightForWrapGroup = 0;\n                }\n            }\n\n            let averageChildWidth = this.wrapGroupDimensions.sumOfKnownWrapGroupChildWidths / this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n            let averageChildHeight = this.wrapGroupDimensions.sumOfKnownWrapGroupChildHeights / this.wrapGroupDimensions.numberOfKnownWrapGroupChildSizes;\n            defaultChildWidth = this.childWidth || averageChildWidth || viewportWidth;\n            defaultChildHeight = this.childHeight || averageChildHeight || viewportHeight;\n\n            if (this.horizontal) {\n                if (viewportWidth > sumOfVisibleMaxWidths) {\n                    wrapGroupsPerPage += Math.ceil((viewportWidth - sumOfVisibleMaxWidths) / defaultChildWidth);\n                }\n            } else {\n                if (viewportHeight > sumOfVisibleMaxHeights) {\n                    wrapGroupsPerPage += Math.ceil((viewportHeight - sumOfVisibleMaxHeights) / defaultChildHeight);\n                }\n            }\n        }\n\n        let itemCount = this.items.length;\n        let itemsPerPage = itemsPerWrapGroup * wrapGroupsPerPage;\n        let pageCount_fractional = itemCount / itemsPerPage;\n        let numberOfWrapGroups = Math.ceil(itemCount / itemsPerWrapGroup);\n\n        let scrollLength = 0;\n\n        let defaultScrollLengthPerWrapGroup = this.horizontal ? defaultChildWidth : defaultChildHeight;\n        if (this.enableUnequalChildrenSizes) {\n            let numUnknownChildSizes = 0;\n            for (let i = 0; i < numberOfWrapGroups; ++i) {\n                let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];\n                if (childSize) {\n                    scrollLength += childSize;\n                } else {\n                    ++numUnknownChildSizes;\n                }\n            }\n\n            scrollLength += Math.round(numUnknownChildSizes * defaultScrollLengthPerWrapGroup);\n        } else {\n            scrollLength = numberOfWrapGroups * defaultScrollLengthPerWrapGroup;\n        }\n\n        if (this.headerElementRef) {\n            scrollLength += this.headerElementRef.nativeElement.clientHeight;\n        }\n\n        let viewportLength = this.horizontal ? viewportWidth : viewportHeight;\n        let maxScrollPosition = Math.max(scrollLength - viewportLength, 0);\n\n        return {\n            childHeight: defaultChildHeight,\n            childWidth: defaultChildWidth,\n            itemCount: itemCount,\n            itemsPerPage: itemsPerPage,\n            itemsPerWrapGroup: itemsPerWrapGroup,\n            maxScrollPosition: maxScrollPosition,\n            pageCount_fractional: pageCount_fractional,\n            scrollLength: scrollLength,\n            viewportLength: viewportLength,\n            wrapGroupsPerPage: wrapGroupsPerPage,\n        };\n    }\n\n    protected cachedPageSize: number = 0;\n    protected previousScrollNumberElements: number = 0;\n\n    protected calculatePadding(arrayStartIndexWithBuffer: number, dimensions: IDimensions): number {\n        if (dimensions.itemCount === 0) {\n            return 0;\n        }\n\n        let defaultScrollLengthPerWrapGroup = dimensions[this._childScrollDim];\n        let startingWrapGroupIndex = Math.floor(arrayStartIndexWithBuffer / dimensions.itemsPerWrapGroup) || 0;\n\n        if (!this.enableUnequalChildrenSizes) {\n            return defaultScrollLengthPerWrapGroup * startingWrapGroupIndex;\n        }\n\n        let numUnknownChildSizes = 0;\n        let result = 0;\n        for (let i = 0; i < startingWrapGroupIndex; ++i) {\n            let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];\n            if (childSize) {\n                result += childSize;\n            } else {\n                ++numUnknownChildSizes;\n            }\n        }\n        result += Math.round(numUnknownChildSizes * defaultScrollLengthPerWrapGroup);\n\n        return result;\n    }\n\n    protected calculatePageInfo(scrollPosition: number, dimensions: IDimensions): IPageInfo {\n        let scrollPercentage = 0;\n        let scrollBottomPercentage = 1;\n        let arrayStartIndex = 0;\n        let arrayEndIndex = 0;\n        if (this.enableUnequalChildrenSizes) {\n            const numberOfWrapGroups = Math.ceil(dimensions.itemCount / dimensions.itemsPerWrapGroup);\n            let totalScrolledLength = 0;\n            let defaultScrollLengthPerWrapGroup = dimensions[this._childScrollDim];\n            let i = 0;\n            for (; i < numberOfWrapGroups; ++i) {\n                let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[i] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[i][this._childScrollDim];\n                if (childSize) {\n                    totalScrolledLength += childSize;\n                } else {\n                    totalScrolledLength += defaultScrollLengthPerWrapGroup;\n                }\n\n                if (scrollPosition < totalScrolledLength) {\n                    scrollPercentage = i / numberOfWrapGroups;\n                    break;\n                }\n            }\n            let j = i + 1;\n            for (; j < numberOfWrapGroups; ++j) {\n                let childSize = this.wrapGroupDimensions.maxChildSizePerWrapGroup[j] && this.wrapGroupDimensions.maxChildSizePerWrapGroup[j][this._childScrollDim];\n                if (childSize) {\n                    totalScrolledLength += childSize;\n                }\n                else {\n                    totalScrolledLength += defaultScrollLengthPerWrapGroup;\n                }\n                if (scrollPosition + dimensions.viewportLength < totalScrolledLength) {\n                    scrollBottomPercentage = j / numberOfWrapGroups;\n                    break;\n                }\n            }\n            \n            arrayStartIndex = i * dimensions.itemsPerWrapGroup;\n            arrayEndIndex = j * dimensions.itemsPerWrapGroup;\n        } else {\n            scrollPercentage = scrollPosition / dimensions.scrollLength;\n\n            let startingArrayIndex_fractional = Math.min(Math.max(scrollPercentage * dimensions.pageCount_fractional, 0), dimensions.pageCount_fractional) * dimensions.itemsPerPage;\n            let maxStart = dimensions.itemCount - dimensions.itemsPerPage - 1;\n            arrayStartIndex = Math.min(Math.floor(startingArrayIndex_fractional), maxStart);\n            arrayEndIndex = Math.ceil(startingArrayIndex_fractional) + dimensions.itemsPerPage - 1;\n        }\n\n        arrayStartIndex -= arrayStartIndex % dimensions.itemsPerWrapGroup; // round down to start of wrapGroup\n\n        if (this.stripedTable) {\n            let bufferBoundary = 2 * dimensions.itemsPerWrapGroup;\n            if (arrayStartIndex % bufferBoundary !== 0) {\n                arrayStartIndex = Math.max(arrayStartIndex - arrayStartIndex % bufferBoundary, 0);\n            }\n        }\n\n        let endIndexWithinWrapGroup = (arrayEndIndex + 1) % dimensions.itemsPerWrapGroup;\n        if (endIndexWithinWrapGroup > 0) {\n            arrayEndIndex += dimensions.itemsPerWrapGroup - endIndexWithinWrapGroup; // round up to end of wrapGroup\n        }\n\n        if (isNaN(arrayStartIndex)) {\n            arrayStartIndex = 0;\n        }\n        if (isNaN(arrayEndIndex)) {\n            arrayEndIndex = 0;\n        }\n\n        arrayStartIndex = Math.min(Math.max(arrayStartIndex, 0), dimensions.itemCount - 1);\n        arrayEndIndex = Math.min(Math.max(arrayEndIndex, 0), dimensions.itemCount - 1);\n\n        let bufferSize = this.bufferAmount * dimensions.itemsPerWrapGroup;\n        let startIndexWithBuffer = Math.min(Math.max(arrayStartIndex - bufferSize, 0), dimensions.itemCount - 1);\n        let endIndexWithBuffer = Math.min(Math.max(arrayEndIndex + bufferSize, 0), dimensions.itemCount - 1);\n\n        return {\n            startIndex: arrayStartIndex,\n            endIndex: arrayEndIndex,\n            startIndexWithBuffer: startIndexWithBuffer,\n            endIndexWithBuffer: endIndexWithBuffer,\n            scrollStartPosition: scrollPosition,\n            scrollEndPosition: scrollPosition + dimensions.viewportLength,\n            maxScrollPosition: dimensions.maxScrollPosition\n        };\n    }\n\n    protected calculateViewport(): IViewport {\n        let dimensions = this.calculateDimensions();\n        let offset = this.getElementsOffset();\n\n        let scrollStartPosition = this.getScrollStartPosition();\n        if (scrollStartPosition > (dimensions.scrollLength + offset) && !(this.parentScroll instanceof Window)) {\n            scrollStartPosition = dimensions.scrollLength;\n        } else {\n            scrollStartPosition -= offset;\n        }\n        scrollStartPosition = Math.max(0, scrollStartPosition);\n\n        let pageInfo = this.calculatePageInfo(scrollStartPosition, dimensions);\n        let newPadding = this.calculatePadding(pageInfo.startIndexWithBuffer, dimensions);\n        let newScrollLength = Math.round(dimensions.scrollLength);\n\n        return {\n            startIndex: pageInfo.startIndex,\n            endIndex: pageInfo.endIndex,\n            startIndexWithBuffer: pageInfo.startIndexWithBuffer,\n            endIndexWithBuffer: pageInfo.endIndexWithBuffer,\n            padding: Math.round(newPadding),\n            scrollLength: newScrollLength,\n            scrollbarLength: newScrollLength + offset,\n            scrollStartPosition: pageInfo.scrollStartPosition,\n            scrollEndPosition: pageInfo.scrollEndPosition,\n            maxScrollPosition: pageInfo.maxScrollPosition\n        };\n    }\n}\n\n\n\n","import { NgModule } from '@angular/core';\nimport {\n  VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY,\n  VirtualScrollerComponent\n} from './ngx-virtual-scroller.component';\nimport {CommonModule} from \"@angular/common\";\n\n@NgModule({\n  exports: [VirtualScrollerComponent],\n  declarations: [VirtualScrollerComponent],\n  imports: [CommonModule],\n  providers: [\n    {\n      provide: 'virtual-scroller-default-options',\n      useFactory: VIRTUAL_SCROLLER_DEFAULT_OPTIONS_FACTORY\n    }\n  ]\n})\nexport class VirtualScrollerModule { }\n","/*\n * Public API Surface of ngx-virtual-scroller\n */\n\nexport * from './lib/ngx-virtual-scroller.module';\nexport * from './lib/ngx-virtual-scroller.component';\n\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}