UNPKG

react-table-6

Version:

A fast, lightweight, opinionated table and datagrid built on React

749 lines (646 loc) 84.7 kB
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } import React from 'react'; import _ from './utils'; export default (function (Base) { return function (_Base) { _inherits(_class, _Base); function _class() { _classCallCheck(this, _class); return _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).apply(this, arguments)); } _createClass(_class, [{ key: 'getResolvedState', value: function getResolvedState(props, state) { var resolvedState = _extends({}, _.compactObject(this.state), _.compactObject(this.props), _.compactObject(state), _.compactObject(props)); return resolvedState; } }, { key: 'getDataModel', value: function getDataModel(newState, dataChanged) { var _this2 = this; var columns = newState.columns, _newState$pivotBy = newState.pivotBy, pivotBy = _newState$pivotBy === undefined ? [] : _newState$pivotBy, data = newState.data, resolveData = newState.resolveData, pivotIDKey = newState.pivotIDKey, pivotValKey = newState.pivotValKey, subRowsKey = newState.subRowsKey, aggregatedKey = newState.aggregatedKey, nestingLevelKey = newState.nestingLevelKey, originalKey = newState.originalKey, indexKey = newState.indexKey, groupedByPivotKey = newState.groupedByPivotKey, SubComponent = newState.SubComponent; // Determine Header Groups var hasHeaderGroups = false; columns.forEach(function (column) { if (column.columns) { hasHeaderGroups = true; } }); var columnsWithExpander = [].concat(_toConsumableArray(columns)); var expanderColumn = columns.find(function (col) { return col.expander || col.columns && col.columns.some(function (col2) { return col2.expander; }); }); // The actual expander might be in the columns field of a group column if (expanderColumn && !expanderColumn.expander) { expanderColumn = expanderColumn.columns.find(function (col) { return col.expander; }); } // If we have SubComponent's we need to make sure we have an expander column if (SubComponent && !expanderColumn) { expanderColumn = { expander: true }; columnsWithExpander = [expanderColumn].concat(_toConsumableArray(columnsWithExpander)); } var makeDecoratedColumn = function makeDecoratedColumn(column, parentColumn) { var dcol = void 0; if (column.expander) { dcol = _extends({}, _this2.props.column, _this2.props.expanderDefaults, column); } else { dcol = _extends({}, _this2.props.column, column); } // Ensure minWidth is not greater than maxWidth if set if (dcol.maxWidth < dcol.minWidth) { dcol.minWidth = dcol.maxWidth; } if (parentColumn) { dcol.parentColumn = parentColumn; } // First check for string accessor if (typeof dcol.accessor === 'string') { dcol.id = dcol.id || dcol.accessor; var accessorString = dcol.accessor; dcol.accessor = function (row) { return _.get(row, accessorString); }; return dcol; } // Fall back to functional accessor (but require an ID) if (dcol.accessor && !dcol.id) { console.warn(dcol); throw new Error('A column id is required if using a non-string accessor for column above.'); } // Fall back to an undefined accessor if (!dcol.accessor) { dcol.accessor = function () { return undefined; }; } return dcol; }; var allDecoratedColumns = []; // Decorate the columns var decorateAndAddToAll = function decorateAndAddToAll(column, parentColumn) { var decoratedColumn = makeDecoratedColumn(column, parentColumn); allDecoratedColumns.push(decoratedColumn); return decoratedColumn; }; var decoratedColumns = columnsWithExpander.map(function (column) { if (column.columns) { return _extends({}, column, { columns: column.columns.map(function (d) { return decorateAndAddToAll(d, column); }) }); } return decorateAndAddToAll(column); }); // Build the visible columns, headers and flat column list var visibleColumns = decoratedColumns.slice(); var allVisibleColumns = []; visibleColumns = visibleColumns.map(function (column) { if (column.columns) { var visibleSubColumns = column.columns.filter(function (d) { return pivotBy.indexOf(d.id) > -1 ? false : _.getFirstDefined(d.show, true); }); return _extends({}, column, { columns: visibleSubColumns }); } return column; }); visibleColumns = visibleColumns.filter(function (column) { return column.columns ? column.columns.length : pivotBy.indexOf(column.id) > -1 ? false : _.getFirstDefined(column.show, true); }); // Find any custom pivot location var pivotIndex = visibleColumns.findIndex(function (col) { return col.pivot; }); // Handle Pivot Columns if (pivotBy.length) { // Retrieve the pivot columns in the correct pivot order var pivotColumns = []; pivotBy.forEach(function (pivotID) { var found = allDecoratedColumns.find(function (d) { return d.id === pivotID; }); if (found) { pivotColumns.push(found); } }); var PivotParentColumn = pivotColumns.reduce(function (prev, current) { return prev && prev === current.parentColumn && current.parentColumn; }, pivotColumns[0].parentColumn); var PivotGroupHeader = hasHeaderGroups && PivotParentColumn.Header; PivotGroupHeader = PivotGroupHeader || function () { return React.createElement( 'strong', null, 'Pivoted' ); }; var pivotColumnGroup = { Header: PivotGroupHeader, columns: pivotColumns.map(function (col) { return _extends({}, _this2.props.pivotDefaults, col, { pivoted: true }); }) // Place the pivotColumns back into the visibleColumns };if (pivotIndex >= 0) { pivotColumnGroup = _extends({}, visibleColumns[pivotIndex], pivotColumnGroup); visibleColumns.splice(pivotIndex, 1, pivotColumnGroup); } else { visibleColumns.unshift(pivotColumnGroup); } } // Build Header Groups var headerGroups = []; var currentSpan = []; // A convenience function to add a header and reset the currentSpan var addHeader = function addHeader(columns, column) { headerGroups.push(_extends({}, _this2.props.column, column, { columns: columns })); currentSpan = []; }; // Build flast list of allVisibleColumns and HeaderGroups visibleColumns.forEach(function (column) { if (column.columns) { allVisibleColumns = allVisibleColumns.concat(column.columns); if (currentSpan.length > 0) { addHeader(currentSpan); } addHeader(column.columns, column); return; } allVisibleColumns.push(column); currentSpan.push(column); }); if (hasHeaderGroups && currentSpan.length > 0) { addHeader(currentSpan); } // Access the data var accessRow = function accessRow(d, i) { var _row; var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var row = (_row = {}, _defineProperty(_row, originalKey, d), _defineProperty(_row, indexKey, i), _defineProperty(_row, subRowsKey, d[subRowsKey]), _defineProperty(_row, nestingLevelKey, level), _row); allDecoratedColumns.forEach(function (column) { if (column.expander) return; row[column.id] = column.accessor(d); }); if (row[subRowsKey]) { row[subRowsKey] = row[subRowsKey].map(function (d, i) { return accessRow(d, i, level + 1); }); } return row; }; // // If the data hasn't changed, just use the cached data var resolvedData = this.resolvedData; // If the data has changed, run the data resolver and cache the result if (!this.resolvedData || dataChanged) { resolvedData = resolveData(data); this.resolvedData = resolvedData; } // Use the resolved data resolvedData = resolvedData.map(function (d, i) { return accessRow(d, i); }); // TODO: Make it possible to fabricate nested rows without pivoting var aggregatingColumns = allVisibleColumns.filter(function (d) { return !d.expander && d.aggregate; }); // If pivoting, recursively group the data var aggregate = function aggregate(rows) { var aggregationValues = {}; aggregatingColumns.forEach(function (column) { var values = rows.map(function (d) { return d[column.id]; }); aggregationValues[column.id] = column.aggregate(values, rows); }); return aggregationValues; }; if (pivotBy.length) { var groupRecursively = function groupRecursively(rows, keys) { var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; // This is the last level, just return the rows if (i === keys.length) { return rows; } // Group the rows together for this level var groupedRows = Object.entries(_.groupBy(rows, keys[i])).map(function (_ref) { var _ref3; var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], value = _ref2[1]; return _ref3 = {}, _defineProperty(_ref3, pivotIDKey, keys[i]), _defineProperty(_ref3, pivotValKey, key), _defineProperty(_ref3, keys[i], key), _defineProperty(_ref3, subRowsKey, value), _defineProperty(_ref3, nestingLevelKey, i), _defineProperty(_ref3, groupedByPivotKey, true), _ref3; }); // Recurse into the subRows groupedRows = groupedRows.map(function (rowGroup) { var _extends2; var subRows = groupRecursively(rowGroup[subRowsKey], keys, i + 1); return _extends({}, rowGroup, (_extends2 = {}, _defineProperty(_extends2, subRowsKey, subRows), _defineProperty(_extends2, aggregatedKey, true), _extends2), aggregate(subRows)); }); return groupedRows; }; resolvedData = groupRecursively(resolvedData, pivotBy); } return _extends({}, newState, { resolvedData: resolvedData, allVisibleColumns: allVisibleColumns, headerGroups: headerGroups, allDecoratedColumns: allDecoratedColumns, hasHeaderGroups: hasHeaderGroups }); } }, { key: 'getSortedData', value: function getSortedData(resolvedState) { var manual = resolvedState.manual, sorted = resolvedState.sorted, filtered = resolvedState.filtered, defaultFilterMethod = resolvedState.defaultFilterMethod, resolvedData = resolvedState.resolvedData, allDecoratedColumns = resolvedState.allDecoratedColumns; var sortMethodsByColumnID = {}; allDecoratedColumns.filter(function (col) { return col.sortMethod; }).forEach(function (col) { sortMethodsByColumnID[col.id] = col.sortMethod; }); // Resolve the data from either manual data or sorted data return { sortedData: manual ? resolvedData : this.sortData(this.filterData(resolvedData, filtered, defaultFilterMethod, allDecoratedColumns), sorted, sortMethodsByColumnID) }; } }, { key: 'fireFetchData', value: function fireFetchData() { // determine the current state, preferring certain state values over props var currentState = _extends({}, this.getResolvedState(), { page: this.getStateOrProp('page'), pageSize: this.getStateOrProp('pageSize'), filtered: this.getStateOrProp('filtered') }); this.props.onFetchData(currentState, this); } }, { key: 'getPropOrState', value: function getPropOrState(key) { return _.getFirstDefined(this.props[key], this.state[key]); } }, { key: 'getStateOrProp', value: function getStateOrProp(key) { return _.getFirstDefined(this.state[key], this.props[key]); } }, { key: 'filterData', value: function filterData(data, filtered, defaultFilterMethod, allVisibleColumns) { var _this3 = this; var filteredData = data; if (filtered.length) { filteredData = filtered.reduce(function (filteredSoFar, nextFilter) { var column = allVisibleColumns.find(function (x) { return x.id === nextFilter.id; }); // Don't filter hidden columns or columns that have had their filters disabled if (!column || column.filterable === false) { return filteredSoFar; } var filterMethod = column.filterMethod || defaultFilterMethod; // If 'filterAll' is set to true, pass the entire dataset to the filter method if (column.filterAll) { return filterMethod(nextFilter, filteredSoFar, column); } return filteredSoFar.filter(function (row) { return filterMethod(nextFilter, row, column); }); }, filteredData); // Apply the filter to the subrows if we are pivoting, and then // filter any rows without subcolumns because it would be strange to show filteredData = filteredData.map(function (row) { if (!row[_this3.props.subRowsKey]) { return row; } return _extends({}, row, _defineProperty({}, _this3.props.subRowsKey, _this3.filterData(row[_this3.props.subRowsKey], filtered, defaultFilterMethod, allVisibleColumns))); }).filter(function (row) { if (!row[_this3.props.subRowsKey]) { return true; } return row[_this3.props.subRowsKey].length > 0; }); } return filteredData; } }, { key: 'sortData', value: function sortData(data, sorted) { var _this4 = this; var sortMethodsByColumnID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (!sorted.length) { return data; } var sortedData = (this.props.orderByMethod || _.orderBy)(data, sorted.map(function (sort) { // Support custom sorting methods for each column if (sortMethodsByColumnID[sort.id]) { return function (a, b) { return sortMethodsByColumnID[sort.id](a[sort.id], b[sort.id], sort.desc); }; } return function (a, b) { return _this4.props.defaultSortMethod(a[sort.id], b[sort.id], sort.desc); }; }), sorted.map(function (d) { return !d.desc; }), this.props.indexKey); sortedData.forEach(function (row) { if (!row[_this4.props.subRowsKey]) { return; } row[_this4.props.subRowsKey] = _this4.sortData(row[_this4.props.subRowsKey], sorted, sortMethodsByColumnID); }); return sortedData; } }, { key: 'getMinRows', value: function getMinRows() { return _.getFirstDefined(this.props.minRows, this.getStateOrProp('pageSize')); } // User actions }, { key: 'onPageChange', value: function onPageChange(page) { var _props = this.props, onPageChange = _props.onPageChange, collapseOnPageChange = _props.collapseOnPageChange; var newState = { page: page }; if (collapseOnPageChange) { newState.expanded = {}; } this.setStateWithData(newState, function () { return onPageChange && onPageChange(page); }); } }, { key: 'onPageSizeChange', value: function onPageSizeChange(newPageSize) { var onPageSizeChange = this.props.onPageSizeChange; var _getResolvedState = this.getResolvedState(), pageSize = _getResolvedState.pageSize, page = _getResolvedState.page; // Normalize the page to display var currentRow = pageSize * page; var newPage = Math.floor(currentRow / newPageSize); this.setStateWithData({ pageSize: newPageSize, page: newPage }, function () { return onPageSizeChange && onPageSizeChange(newPageSize, newPage); }); } }, { key: 'sortColumn', value: function sortColumn(column, additive) { var _getResolvedState2 = this.getResolvedState(), sorted = _getResolvedState2.sorted, skipNextSort = _getResolvedState2.skipNextSort, defaultSortDesc = _getResolvedState2.defaultSortDesc; var firstSortDirection = Object.prototype.hasOwnProperty.call(column, 'defaultSortDesc') ? column.defaultSortDesc : defaultSortDesc; var secondSortDirection = !firstSortDirection; // we can't stop event propagation from the column resize move handlers // attached to the document because of react's synthetic events // so we have to prevent the sort function from actually sorting // if we click on the column resize element within a header. if (skipNextSort) { this.setStateWithData({ skipNextSort: false }); return; } var onSortedChange = this.props.onSortedChange; var newSorted = _.clone(sorted || []).map(function (d) { d.desc = _.isSortingDesc(d); return d; }); if (!_.isArray(column)) { // Single-Sort var existingIndex = newSorted.findIndex(function (d) { return d.id === column.id; }); if (existingIndex > -1) { var existing = newSorted[existingIndex]; if (existing.desc === secondSortDirection) { if (additive) { newSorted.splice(existingIndex, 1); } else { existing.desc = firstSortDirection; newSorted = [existing]; } } else { existing.desc = secondSortDirection; if (!additive) { newSorted = [existing]; } } } else if (additive) { newSorted.push({ id: column.id, desc: firstSortDirection }); } else { newSorted = [{ id: column.id, desc: firstSortDirection }]; } } else { // Multi-Sort var _existingIndex = newSorted.findIndex(function (d) { return d.id === column[0].id; }); // Existing Sorted Column if (_existingIndex > -1) { var _existing = newSorted[_existingIndex]; if (_existing.desc === secondSortDirection) { if (additive) { newSorted.splice(_existingIndex, column.length); } else { column.forEach(function (d, i) { newSorted[_existingIndex + i].desc = firstSortDirection; }); } } else { column.forEach(function (d, i) { newSorted[_existingIndex + i].desc = secondSortDirection; }); } if (!additive) { newSorted = newSorted.slice(_existingIndex, column.length); } // New Sort Column } else if (additive) { newSorted = newSorted.concat(column.map(function (d) { return { id: d.id, desc: firstSortDirection }; })); } else { newSorted = column.map(function (d) { return { id: d.id, desc: firstSortDirection }; }); } } this.setStateWithData({ page: !sorted.length && newSorted.length || !additive ? 0 : this.state.page, sorted: newSorted }, function () { return onSortedChange && onSortedChange(newSorted, column, additive); }); } }, { key: 'filterColumn', value: function filterColumn(column, value) { var _getResolvedState3 = this.getResolvedState(), filtered = _getResolvedState3.filtered; var onFilteredChange = this.props.onFilteredChange; // Remove old filter first if it exists var newFiltering = (filtered || []).filter(function (x) { return x.id !== column.id; }); if (value !== '') { newFiltering.push({ id: column.id, value: value }); } this.setStateWithData({ filtered: newFiltering }, function () { return onFilteredChange && onFilteredChange(newFiltering, column, value); }); } }, { key: 'resizeColumnStart', value: function resizeColumnStart(event, column, isTouch) { var _this5 = this; event.stopPropagation(); var parentWidth = event.target.parentElement.getBoundingClientRect().width; var pageX = void 0; if (isTouch) { pageX = event.changedTouches[0].pageX; } else { pageX = event.pageX; } this.trapEvents = true; this.setStateWithData({ currentlyResizing: { id: column.id, startX: pageX, parentWidth: parentWidth } }, function () { if (isTouch) { document.addEventListener('touchmove', _this5.resizeColumnMoving); document.addEventListener('touchcancel', _this5.resizeColumnEnd); document.addEventListener('touchend', _this5.resizeColumnEnd); } else { document.addEventListener('mousemove', _this5.resizeColumnMoving); document.addEventListener('mouseup', _this5.resizeColumnEnd); document.addEventListener('mouseleave', _this5.resizeColumnEnd); } }); } }, { key: 'resizeColumnMoving', value: function resizeColumnMoving(event) { event.stopPropagation(); var _props2 = this.props, onResizedChange = _props2.onResizedChange, column = _props2.column; var _getResolvedState4 = this.getResolvedState(), resized = _getResolvedState4.resized, currentlyResizing = _getResolvedState4.currentlyResizing, columns = _getResolvedState4.columns; var currentColumn = columns.find(function (c) { return c.accessor === currentlyResizing.id || c.id === currentlyResizing.id; }); var minResizeWidth = currentColumn && currentColumn.minResizeWidth != null ? currentColumn.minResizeWidth : column.minResizeWidth; // Delete old value var newResized = resized.filter(function (x) { return x.id !== currentlyResizing.id; }); var pageX = void 0; if (event.type === 'touchmove') { pageX = event.changedTouches[0].pageX; } else if (event.type === 'mousemove') { pageX = event.pageX; } var newWidth = Math.max(currentlyResizing.parentWidth + pageX - currentlyResizing.startX, minResizeWidth); newResized.push({ id: currentlyResizing.id, value: newWidth }); this.setStateWithData({ resized: newResized }, function () { return onResizedChange && onResizedChange(newResized, event); }); } }, { key: 'resizeColumnEnd', value: function resizeColumnEnd(event) { event.stopPropagation(); var isTouch = event.type === 'touchend' || event.type === 'touchcancel'; if (isTouch) { document.removeEventListener('touchmove', this.resizeColumnMoving); document.removeEventListener('touchcancel', this.resizeColumnEnd); document.removeEventListener('touchend', this.resizeColumnEnd); } // If its a touch event clear the mouse one's as well because sometimes // the mouseDown event gets called as well, but the mouseUp event doesn't document.removeEventListener('mousemove', this.resizeColumnMoving); document.removeEventListener('mouseup', this.resizeColumnEnd); document.removeEventListener('mouseleave', this.resizeColumnEnd); // The touch events don't propagate up to the sorting's onMouseDown event so // no need to prevent it from happening or else the first click after a touch // event resize will not sort the column. if (!isTouch) { this.setStateWithData({ skipNextSort: true, currentlyResizing: false }); } } }]); return _class; }(Base); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRob2RzLmpzIl0sIm5hbWVzIjpbIlJlYWN0IiwiXyIsInByb3BzIiwic3RhdGUiLCJyZXNvbHZlZFN0YXRlIiwiY29tcGFjdE9iamVjdCIsIm5ld1N0YXRlIiwiZGF0YUNoYW5nZWQiLCJjb2x1bW5zIiwicGl2b3RCeSIsImRhdGEiLCJyZXNvbHZlRGF0YSIsInBpdm90SURLZXkiLCJwaXZvdFZhbEtleSIsInN1YlJvd3NLZXkiLCJhZ2dyZWdhdGVkS2V5IiwibmVzdGluZ0xldmVsS2V5Iiwib3JpZ2luYWxLZXkiLCJpbmRleEtleSIsImdyb3VwZWRCeVBpdm90S2V5IiwiU3ViQ29tcG9uZW50IiwiaGFzSGVhZGVyR3JvdXBzIiwiZm9yRWFjaCIsImNvbHVtbiIsImNvbHVtbnNXaXRoRXhwYW5kZXIiLCJleHBhbmRlckNvbHVtbiIsImZpbmQiLCJjb2wiLCJleHBhbmRlciIsInNvbWUiLCJjb2wyIiwibWFrZURlY29yYXRlZENvbHVtbiIsInBhcmVudENvbHVtbiIsImRjb2wiLCJleHBhbmRlckRlZmF1bHRzIiwibWF4V2lkdGgiLCJtaW5XaWR0aCIsImFjY2Vzc29yIiwiaWQiLCJhY2Nlc3NvclN0cmluZyIsImdldCIsInJvdyIsImNvbnNvbGUiLCJ3YXJuIiwiRXJyb3IiLCJ1bmRlZmluZWQiLCJhbGxEZWNvcmF0ZWRDb2x1bW5zIiwiZGVjb3JhdGVBbmRBZGRUb0FsbCIsImRlY29yYXRlZENvbHVtbiIsInB1c2giLCJkZWNvcmF0ZWRDb2x1bW5zIiwibWFwIiwiZCIsInZpc2libGVDb2x1bW5zIiwic2xpY2UiLCJhbGxWaXNpYmxlQ29sdW1ucyIsInZpc2libGVTdWJDb2x1bW5zIiwiZmlsdGVyIiwiaW5kZXhPZiIsImdldEZpcnN0RGVmaW5lZCIsInNob3ciLCJsZW5ndGgiLCJwaXZvdEluZGV4IiwiZmluZEluZGV4IiwicGl2b3QiLCJwaXZvdENvbHVtbnMiLCJmb3VuZCIsInBpdm90SUQiLCJQaXZvdFBhcmVudENvbHVtbiIsInJlZHVjZSIsInByZXYiLCJjdXJyZW50IiwiUGl2b3RHcm91cEhlYWRlciIsIkhlYWRlciIsInBpdm90Q29sdW1uR3JvdXAiLCJwaXZvdERlZmF1bHRzIiwicGl2b3RlZCIsInNwbGljZSIsInVuc2hpZnQiLCJoZWFkZXJHcm91cHMiLCJjdXJyZW50U3BhbiIsImFkZEhlYWRlciIsImNvbmNhdCIsImFjY2Vzc1JvdyIsImkiLCJsZXZlbCIsInJlc29sdmVkRGF0YSIsImFnZ3JlZ2F0aW5nQ29sdW1ucyIsImFnZ3JlZ2F0ZSIsImFnZ3JlZ2F0aW9uVmFsdWVzIiwidmFsdWVzIiwicm93cyIsImdyb3VwUmVjdXJzaXZlbHkiLCJrZXlzIiwiZ3JvdXBlZFJvd3MiLCJPYmplY3QiLCJlbnRyaWVzIiwiZ3JvdXBCeSIsImtleSIsInZhbHVlIiwic3ViUm93cyIsInJvd0dyb3VwIiwibWFudWFsIiwic29ydGVkIiwiZmlsdGVyZWQiLCJkZWZhdWx0RmlsdGVyTWV0aG9kIiwic29ydE1ldGhvZHNCeUNvbHVtbklEIiwic29ydE1ldGhvZCIsInNvcnRlZERhdGEiLCJzb3J0RGF0YSIsImZpbHRlckRhdGEiLCJjdXJyZW50U3RhdGUiLCJnZXRSZXNvbHZlZFN0YXRlIiwicGFnZSIsImdldFN0YXRlT3JQcm9wIiwicGFnZVNpemUiLCJvbkZldGNoRGF0YSIsImZpbHRlcmVkRGF0YSIsImZpbHRlcmVkU29GYXIiLCJuZXh0RmlsdGVyIiwieCIsImZpbHRlcmFibGUiLCJmaWx0ZXJNZXRob2QiLCJmaWx0ZXJBbGwiLCJvcmRlckJ5TWV0aG9kIiwib3JkZXJCeSIsInNvcnQiLCJhIiwiYiIsImRlc2MiLCJkZWZhdWx0U29ydE1ldGhvZCIsIm1pblJvd3MiLCJvblBhZ2VDaGFuZ2UiLCJjb2xsYXBzZU9uUGFnZUNoYW5nZSIsImV4cGFuZGVkIiwic2V0U3RhdGVXaXRoRGF0YSIsIm5ld1BhZ2VTaXplIiwib25QYWdlU2l6ZUNoYW5nZSIsImN1cnJlbnRSb3ciLCJuZXdQYWdlIiwiTWF0aCIsImZsb29yIiwiYWRkaXRpdmUiLCJza2lwTmV4dFNvcnQiLCJkZWZhdWx0U29ydERlc2MiLCJmaXJzdFNvcnREaXJlY3Rpb24iLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzZWNvbmRTb3J0RGlyZWN0aW9uIiwib25Tb3J0ZWRDaGFuZ2UiLCJuZXdTb3J0ZWQiLCJjbG9uZSIsImlzU29ydGluZ0Rlc2MiLCJpc0FycmF5IiwiZXhpc3RpbmdJbmRleCIsImV4aXN0aW5nIiwib25GaWx0ZXJlZENoYW5nZSIsIm5ld0ZpbHRlcmluZyIsImV2ZW50IiwiaXNUb3VjaCIsInN0b3BQcm9wYWdhdGlvbiIsInBhcmVudFdpZHRoIiwidGFyZ2V0IiwicGFyZW50RWxlbWVudCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIndpZHRoIiwicGFnZVgiLCJjaGFuZ2VkVG91Y2hlcyIsInRyYXBFdmVudHMiLCJjdXJyZW50bHlSZXNpemluZyIsInN0YXJ0WCIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc2l6ZUNvbHVtbk1vdmluZyIsInJlc2l6ZUNvbHVtbkVuZCIsIm9uUmVzaXplZENoYW5nZSIsInJlc2l6ZWQiLCJjdXJyZW50Q29sdW1uIiwiYyIsIm1pblJlc2l6ZVdpZHRoIiwibmV3UmVzaXplZCIsInR5cGUiLCJuZXdXaWR0aCIsIm1heCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJCYXNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBUCxNQUFrQixPQUFsQjtBQUNBLE9BQU9DLENBQVAsTUFBYyxTQUFkOztBQUVBLGdCQUFlO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLHVDQUVPQyxLQUZQLEVBRWNDLEtBRmQsRUFFcUI7QUFDOUIsWUFBTUMsNkJBQ0RILEVBQUVJLGFBQUYsQ0FBZ0IsS0FBS0YsS0FBckIsQ0FEQyxFQUVERixFQUFFSSxhQUFGLENBQWdCLEtBQUtILEtBQXJCLENBRkMsRUFHREQsRUFBRUksYUFBRixDQUFnQkYs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