UNPKG

matrix-react-sdk

Version:
113 lines (110 loc) 16.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); /* Copyright 2019-2024 New Vector Ltd. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class ItemRange { constructor(topCount, renderCount, bottomCount) { this.topCount = topCount; this.renderCount = renderCount; this.bottomCount = bottomCount; } contains(range) { // don't contain empty ranges // as it will prevent clearing the list // once it is scrolled far enough out of view if (!range.renderCount && this.renderCount) { return false; } return range.topCount >= this.topCount && range.topCount + range.renderCount <= this.topCount + this.renderCount; } expand(amount) { // don't expand ranges that won't render anything if (this.renderCount === 0) { return this; } const topGrow = Math.min(amount, this.topCount); const bottomGrow = Math.min(amount, this.bottomCount); return new ItemRange(this.topCount - topGrow, this.renderCount + topGrow + bottomGrow, this.bottomCount - bottomGrow); } totalSize() { return this.topCount + this.renderCount + this.bottomCount; } } class LazyRenderList extends _react.default.Component { constructor(props) { super(props); this.state = LazyRenderList.getDerivedStateFromProps(props, {}); } static getDerivedStateFromProps(props, state) { const range = LazyRenderList.getVisibleRangeFromProps(props); const intersectRange = range.expand(props.overflowMargin); const renderRange = range.expand(props.overflowItems); const listHasChangedSize = !!state.renderRange && renderRange.totalSize() !== state.renderRange.totalSize(); // only update render Range if the list has shrunk/grown and we need to adjust padding OR // if the new range + overflowMargin isn't contained by the old anymore if (listHasChangedSize || !state.renderRange || !state.renderRange.contains(intersectRange)) { return { renderRange }; } return null; } static getVisibleRangeFromProps(props) { const { items, itemHeight, scrollTop, height } = props; const length = items ? items.length : 0; const topCount = Math.min(Math.max(0, Math.floor(scrollTop / itemHeight)), length); const itemsAfterTop = length - topCount; const visibleItems = height !== 0 ? Math.ceil(height / itemHeight) : 0; const renderCount = Math.min(visibleItems, itemsAfterTop); const bottomCount = itemsAfterTop - renderCount; return new ItemRange(topCount, renderCount, bottomCount); } render() { const { itemHeight, items, renderItem } = this.props; const { renderRange } = this.state; const { topCount, renderCount, bottomCount } = renderRange; const paddingTop = topCount * itemHeight; const paddingBottom = bottomCount * itemHeight; const renderedItems = (items || []).slice(topCount, topCount + renderCount); const element = this.props.element || "div"; const elementProps = { style: { paddingTop: `${paddingTop}px`, paddingBottom: `${paddingBottom}px` }, className: this.props.className, role: this.props.role }; return /*#__PURE__*/_react.default.createElement(element, elementProps, renderedItems.map(renderItem)); } } exports.default = LazyRenderList; (0, _defineProperty2.default)(LazyRenderList, "defaultProps", { overflowItems: 20, overflowMargin: 5 }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIkl0ZW1SYW5nZSIsImNvbnN0cnVjdG9yIiwidG9wQ291bnQiLCJyZW5kZXJDb3VudCIsImJvdHRvbUNvdW50IiwiY29udGFpbnMiLCJyYW5nZSIsImV4cGFuZCIsImFtb3VudCIsInRvcEdyb3ciLCJNYXRoIiwibWluIiwiYm90dG9tR3JvdyIsInRvdGFsU2l6ZSIsIkxhenlSZW5kZXJMaXN0IiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wcyIsInN0YXRlIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiZ2V0VmlzaWJsZVJhbmdlRnJvbVByb3BzIiwiaW50ZXJzZWN0UmFuZ2UiLCJvdmVyZmxvd01hcmdpbiIsInJlbmRlclJhbmdlIiwib3ZlcmZsb3dJdGVtcyIsImxpc3RIYXNDaGFuZ2VkU2l6ZSIsIml0ZW1zIiwiaXRlbUhlaWdodCIsInNjcm9sbFRvcCIsImhlaWdodCIsImxlbmd0aCIsIm1heCIsImZsb29yIiwiaXRlbXNBZnRlclRvcCIsInZpc2libGVJdGVtcyIsImNlaWwiLCJyZW5kZXIiLCJyZW5kZXJJdGVtIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJyZW5kZXJlZEl0ZW1zIiwic2xpY2UiLCJlbGVtZW50IiwiZWxlbWVudFByb3BzIiwic3R5bGUiLCJjbGFzc05hbWUiLCJyb2xlIiwiY3JlYXRlRWxlbWVudCIsIm1hcCIsImV4cG9ydHMiLCJkZWZhdWx0IiwiX2RlZmluZVByb3BlcnR5MiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0xhenlSZW5kZXJMaXN0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTktMjAyNCBOZXcgVmVjdG9yIEx0ZC5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5jbGFzcyBJdGVtUmFuZ2Uge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHRvcENvdW50OiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZW5kZXJDb3VudDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgYm90dG9tQ291bnQ6IG51bWJlcixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgY29udGFpbnMocmFuZ2U6IEl0ZW1SYW5nZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBkb24ndCBjb250YWluIGVtcHR5IHJhbmdlc1xuICAgICAgICAvLyBhcyBpdCB3aWxsIHByZXZlbnQgY2xlYXJpbmcgdGhlIGxpc3RcbiAgICAgICAgLy8gb25jZSBpdCBpcyBzY3JvbGxlZCBmYXIgZW5vdWdoIG91dCBvZiB2aWV3XG4gICAgICAgIGlmICghcmFuZ2UucmVuZGVyQ291bnQgJiYgdGhpcy5yZW5kZXJDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICByYW5nZS50b3BDb3VudCA+PSB0aGlzLnRvcENvdW50ICYmIHJhbmdlLnRvcENvdW50ICsgcmFuZ2UucmVuZGVyQ291bnQgPD0gdGhpcy50b3BDb3VudCArIHRoaXMucmVuZGVyQ291bnRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwYW5kKGFtb3VudDogbnVtYmVyKTogSXRlbVJhbmdlIHtcbiAgICAgICAgLy8gZG9uJ3QgZXhwYW5kIHJhbmdlcyB0aGF0IHdvbid0IHJlbmRlciBhbnl0aGluZ1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3BHcm93ID0gTWF0aC5taW4oYW1vdW50LCB0aGlzLnRvcENvdW50KTtcbiAgICAgICAgY29uc3QgYm90dG9tR3JvdyA9IE1hdGgubWluKGFtb3VudCwgdGhpcy5ib3R0b21Db3VudCk7XG4gICAgICAgIHJldHVybiBuZXcgSXRlbVJhbmdlKFxuICAgICAgICAgICAgdGhpcy50b3BDb3VudCAtIHRvcEdyb3csXG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvdW50ICsgdG9wR3JvdyArIGJvdHRvbUdyb3csXG4gICAgICAgICAgICB0aGlzLmJvdHRvbUNvdW50IC0gYm90dG9tR3JvdyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG90YWxTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvcENvdW50ICsgdGhpcy5yZW5kZXJDb3VudCArIHRoaXMuYm90dG9tQ291bnQ7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgSVByb3BzPFQ+IHtcbiAgICAvLyBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBjb21wb25lbnQgcmV0dXJuZWQgYnkgYHJlbmRlckl0ZW1gXG4gICAgaXRlbUhlaWdodDogbnVtYmVyO1xuICAgIC8vIGZ1bmN0aW9uIHRvIHR1cm4gYW4gZWxlbWVudCBvZiBgaXRlbXNgIGludG8gYSByZWFjdCBjb21wb25lbnRcbiAgICByZW5kZXJJdGVtOiAoaXRlbTogVCkgPT4gSlNYLkVsZW1lbnQ7XG4gICAgLy8gc2Nyb2xsVG9wIG9mIHRoZSB2aWV3cG9ydCAobWludXMgdGhlIGhlaWdodCBvZiBhbnkgY29udGVudCBhYm92ZSB0aGlzIGxpc3QgbGlrZSBvdGhlciBgTGF6eVJlbmRlckxpc3RgcylcbiAgICBzY3JvbGxUb3A6IG51bWJlcjtcbiAgICAvLyB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCB0aGlzIGNvbnRlbnQgaXMgc2Nyb2xsZWQgaW5cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvLyBhbGwgaXRlbXMgZm9yIHRoZSBsaXN0LiBUaGVzZSBzaG91bGQgbm90IGJlIHJlYWN0IGNvbXBvbmVudHMsIHNlZSBgcmVuZGVySXRlbWAuXG4gICAgaXRlbXM/OiBUW107XG4gICAgLy8gdGhlIGFtb3VudCBvZiBpdGVtcyB0byBzY3JvbGwgYmVmb3JlIGNhdXNpbmcgYSByZXJlbmRlcixcbiAgICAvLyBzaG91bGQgdHlwaWNhbGx5IGJlIGxlc3MgdGhhbiBgb3ZlcmZsb3dJdGVtc2AgdW5sZXNzIGFwcGx5aW5nXG4gICAgLy8gbWFyZ2lucyBpbiB0aGUgcGFyZW50IGNvbXBvbmVudCB3aGVuIHVzaW5nIG11bHRpcGxlIExhenlSZW5kZXJMaXN0IGluIG9uZSB2aWV3cG9ydC5cbiAgICAvLyB1c2UgMCB0byBvbmx5IHJlcmVuZGVyIHdoZW4gaXRlbXMgd2lsbCBjb21lIGludG8gdmlldy5cbiAgICBvdmVyZmxvd01hcmdpbjogbnVtYmVyO1xuICAgIC8vIHRoZSBhbW91bnQgb2YgaXRlbXMgdG8gYWRkIGF0IHRoZSB0b3AgYW5kIGJvdHRvbSB0byByZW5kZXIsXG4gICAgLy8gc28gbm90IGV2ZXJ5IHNjcm9sbCBvZiBjYXVzZXMgYSByZXJlbmRlci5cbiAgICBvdmVyZmxvd0l0ZW1zOiBudW1iZXI7XG5cbiAgICBlbGVtZW50Pzogc3RyaW5nO1xuICAgIGNsYXNzTmFtZT86IHN0cmluZztcbiAgICByb2xlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICByZW5kZXJSYW5nZTogSXRlbVJhbmdlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYXp5UmVuZGVyTGlzdDxUID0gYW55PiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHM8VD4sIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBQYXJ0aWFsPElQcm9wczx1bmtub3duPj4gPSB7XG4gICAgICAgIG92ZXJmbG93SXRlbXM6IDIwLFxuICAgICAgICBvdmVyZmxvd01hcmdpbjogNSxcbiAgICB9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHM8VD4pIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBMYXp5UmVuZGVyTGlzdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHt9IGFzIElTdGF0ZSkgYXMgSVN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPFQ+KHByb3BzOiBJUHJvcHM8VD4sIHN0YXRlOiBJU3RhdGUpOiBQYXJ0aWFsPElTdGF0ZT4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBMYXp5UmVuZGVyTGlzdC5nZXRWaXNpYmxlUmFuZ2VGcm9tUHJvcHMocHJvcHMpO1xuICAgICAgICBjb25zdCBpbnRlcnNlY3RSYW5nZSA9IHJhbmdlLmV4cGFuZChwcm9wcy5vdmVyZmxvd01hcmdpbik7XG4gICAgICAgIGNvbnN0IHJlbmRlclJhbmdlID0gcmFuZ2UuZXhwYW5kKHByb3BzLm92ZXJmbG93SXRlbXMpO1xuICAgICAgICBjb25zdCBsaXN0SGFzQ2hhbmdlZFNpemUgPSAhIXN0YXRlLnJlbmRlclJhbmdlICYmIHJlbmRlclJhbmdlLnRvdGFsU2l6ZSgpICE9PSBzdGF0ZS5yZW5kZXJSYW5nZS50b3RhbFNpemUoKTtcbiAgICAgICAgLy8gb25seSB1cGRhdGUgcmVuZGVyIFJhbmdlIGlmIHRoZSBsaXN0IGhhcyBzaHJ1bmsvZ3Jvd24gYW5kIHdlIG5lZWQgdG8gYWRqdXN0IHBhZGRpbmcgT1JcbiAgICAgICAgLy8gaWYgdGhlIG5ldyByYW5nZSArIG92ZXJmbG93TWFyZ2luIGlzbid0IGNvbnRhaW5lZCBieSB0aGUgb2xkIGFueW1vcmVcbiAgICAgICAgaWYgKGxpc3RIYXNDaGFuZ2VkU2l6ZSB8fCAhc3RhdGUucmVuZGVyUmFuZ2UgfHwgIXN0YXRlLnJlbmRlclJhbmdlLmNvbnRhaW5zKGludGVyc2VjdFJhbmdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVuZGVyUmFuZ2UgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRWaXNpYmxlUmFuZ2VGcm9tUHJvcHM8VD4ocHJvcHM6IElQcm9wczxUPik6IEl0ZW1SYW5nZSB7XG4gICAgICAgIGNvbnN0IHsgaXRlbXMsIGl0ZW1IZWlnaHQsIHNjcm9sbFRvcCwgaGVpZ2h0IH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gaXRlbXMgPyBpdGVtcy5sZW5ndGggOiAwO1xuICAgICAgICBjb25zdCB0b3BDb3VudCA9IE1hdGgubWluKE1hdGgubWF4KDAsIE1hdGguZmxvb3Ioc2Nyb2xsVG9wIC8gaXRlbUhlaWdodCkpLCBsZW5ndGgpO1xuICAgICAgICBjb25zdCBpdGVtc0FmdGVyVG9wID0gbGVuZ3RoIC0gdG9wQ291bnQ7XG4gICAgICAgIGNvbnN0IHZpc2libGVJdGVtcyA9IGhlaWdodCAhPT0gMCA/IE1hdGguY2VpbChoZWlnaHQgLyBpdGVtSGVpZ2h0KSA6IDA7XG4gICAgICAgIGNvbnN0IHJlbmRlckNvdW50ID0gTWF0aC5taW4odmlzaWJsZUl0ZW1zLCBpdGVtc0FmdGVyVG9wKTtcbiAgICAgICAgY29uc3QgYm90dG9tQ291bnQgPSBpdGVtc0FmdGVyVG9wIC0gcmVuZGVyQ291bnQ7XG4gICAgICAgIHJldHVybiBuZXcgSXRlbVJhbmdlKHRvcENvdW50LCByZW5kZXJDb3VudCwgYm90dG9tQ291bnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgY29uc3QgeyBpdGVtSGVpZ2h0LCBpdGVtcywgcmVuZGVySXRlbSB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgeyByZW5kZXJSYW5nZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgeyB0b3BDb3VudCwgcmVuZGVyQ291bnQsIGJvdHRvbUNvdW50IH0gPSByZW5kZXJSYW5nZTtcblxuICAgICAgICBjb25zdCBwYWRkaW5nVG9wID0gdG9wQ291bnQgKiBpdGVtSGVpZ2h0O1xuICAgICAgICBjb25zdCBwYWRkaW5nQm90dG9tID0gYm90dG9tQ291bnQgKiBpdGVtSGVpZ2h0O1xuICAgICAgICBjb25zdCByZW5kZXJlZEl0ZW1zID0gKGl0ZW1zIHx8IFtdKS5zbGljZSh0b3BDb3VudCwgdG9wQ291bnQgKyByZW5kZXJDb3VudCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucHJvcHMuZWxlbWVudCB8fCBcImRpdlwiO1xuICAgICAgICBjb25zdCBlbGVtZW50UHJvcHMgPSB7XG4gICAgICAgICAgICBzdHlsZTogeyBwYWRkaW5nVG9wOiBgJHtwYWRkaW5nVG9wfXB4YCwgcGFkZGluZ0JvdHRvbTogYCR7cGFkZGluZ0JvdHRvbX1weGAgfSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgICByb2xlOiB0aGlzLnByb3BzLnJvbGUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRQcm9wcywgcmVuZGVyZWRJdGVtcy5tYXAocmVuZGVySXRlbSkpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSUEsTUFBTUMsU0FBUyxDQUFDO0VBQ0xDLFdBQVdBLENBQ1BDLFFBQWdCLEVBQ2hCQyxXQUFtQixFQUNuQkMsV0FBbUIsRUFDNUI7SUFBQSxLQUhTRixRQUFnQixHQUFoQkEsUUFBZ0I7SUFBQSxLQUNoQkMsV0FBbUIsR0FBbkJBLFdBQW1CO0lBQUEsS0FDbkJDLFdBQW1CLEdBQW5CQSxXQUFtQjtFQUMzQjtFQUVJQyxRQUFRQSxDQUFDQyxLQUFnQixFQUFXO0lBQ3ZDO0lBQ0E7SUFDQTtJQUNBLElBQUksQ0FBQ0EsS0FBSyxDQUFDSCxXQUFX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QUFJLENBQUN5QixJQUFJLENBQUNOLE1BQU0sR0FBR0YsVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUN0RSxNQUFNeEIsV0FBVyxHQUFHTyxJQUFJLENBQUNDLEdBQUcsQ0FBQ3VCLFlBQVksRUFBRUQsYUFBYSxDQUFDO0lBQ3pELE1BQU03QixXQUFXLEdBQUc2QixhQUFhLEdBQUc5QixXQUFXO0lBQy9DLE9BQU8sSUFBSUgsU0FBUyxDQUFDRSxRQUFRLEVBQUVDLFdBQVcsRUFBRUMsV0FBVyxDQUFDO0VBQzVEO0VBRU9nQyxNQUFNQSxDQUFBLEVBQW9CO0lBQzdCLE1BQU07TUFBRVQsVUFBVTtNQUFFRCxLQUFLO01BQUVXO0lBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQ3BCLEtBQUs7SUFDcEQsTUFBTTtNQUFFTTtJQUFZLENBQUMsR0FBRyxJQUFJLENBQUNMLEtBQUs7SUFDbEMsTUFBTTtNQUFFaEIsUUFBUTtNQUFFQyxXQUFXO01BQUVDO0lBQVksQ0FBQyxHQUFHbUIsV0FBVztJQUUxRCxNQUFNZSxVQUFVLEdBQUdwQyxRQUFRLEdBQUd5QixVQUFVO0lBQ3hDLE1BQU1ZLGFBQWEsR0FBR25DLFdBQVcsR0FBR3VCLFVBQVU7SUFDOUMsTUFBTWEsYUFBYSxHQUFHLENBQUNkLEtBQUssSUFBSSxFQUFFLEVBQUVlLEtBQUssQ0FBQ3ZDLFFBQVEsRUFBRUEsUUFBUSxHQUFHQyxXQUFXLENBQUM7SUFFM0UsTUFBTXVDLE9BQU8sR0FBRyxJQUFJLENBQUN6QixLQUFLLENBQUN5QixPQUFPLElBQUksS0FBSztJQUMzQyxNQUFNQyxZQUFZLEdBQUc7TUFDakJDLEtBQUssRUFBRTtRQUFFTixVQUFVLEVBQUUsR0FBR0EsVUFBVSxJQUFJO1FBQUVDLGFBQWEsRUFBRSxHQUFHQSxhQUFhO01BQUssQ0FBQztNQUM3RU0sU0FBUyxFQUFFLElBQUksQ0FBQzVCLEtBQUssQ0FBQzRCLFNBQVM7TUFDL0JDLElBQUksRUFBRSxJQUFJLENBQUM3QixLQUFLLENBQUM2QjtJQUNyQixDQUFDO0lBQ0Qsb0JBQU8vQixjQUFLLENBQUNnQyxhQUFhLENBQUNMLE9BQU8sRUFBRUMsWUFBWSxFQUFFSCxhQUFhLENBQUNRLEdBQUcsQ0FBQ1gsVUFBVSxDQUFDLENBQUM7RUFDcEY7QUFDSjtBQUFDWSxPQUFBLENBQUFDLE9BQUEsR0FBQXBDLGNBQUE7QUFBQSxJQUFBcUMsZ0JBQUEsQ0FBQUQsT0FBQSxFQXJEb0JwQyxjQUFjLGtCQUN3QjtFQUNuRFUsYUFBYSxFQUFFLEVBQUU7RUFDakJGLGNBQWMsRUFBRTtBQUNwQixDQUFDIiwiaWdub3JlTGlzdCI6W119