UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

204 lines (172 loc) 25.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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _baseWidget = _interopRequireDefault(require("../base-widget")); var _categoryWidgetIcon = _interopRequireDefault(require("./category-widget-icon")); var _aggregateUtils = require("../../utils/aggregate-utils"); var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport")); var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project")); var _fileHandler = require("../../processors/file-handler"); var _booleanDisjoint = _interopRequireDefault(require("@turf/boolean-disjoint")); var _helpers = require("@turf/helpers"); var _simplifyGeojson = _interopRequireDefault(require("simplify-geojson")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var FunctionWidget = /*#__PURE__*/ function (_Widget) { (0, _inherits2["default"])(FunctionWidget, _Widget); function FunctionWidget(props) { (0, _classCallCheck2["default"])(this, FunctionWidget); return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(FunctionWidget).call(this, props)); } (0, _createClass2["default"])(FunctionWidget, [{ key: "calculateAggregationData", value: function calculateAggregationData(newWidget, state, mapState) { var _newWidget$config = newWidget.config, dataId = _newWidget$config.dataId, aggregationType = _newWidget$config.aggregationType, bounds = _newWidget$config.bounds; var _state$datasets$dataI = state.datasets[dataId], data = _state$datasets$dataI.data, label = _state$datasets$dataI.label; var sortableCategories = []; var fields = state.datasets[dataId].fields; var categoryField = newWidget.config.categoryField; var fieldName = newWidget.config.fieldName; var categoryFieldIdx = fields.findIndex(function (f) { return f.name === categoryField; }); var fieldIdx = fields.findIndex(function (f) { return f.name === fieldName; }); var boundingBox; var cUL, cUR, cLL, cLR; var latRange, lngRange; if (!newWidget.config.selectedLayer) { return newWidget; } var idx = state.layers.findIndex(function (l) { return l.id === newWidget.config.selectedLayer.id; }); if (!aggregationType || aggregationType !== 'count' && fieldIdx <= 0) return { newWidget: newWidget, updatedState: state }; if (mapState && bounds) { var longitude = mapState.longitude, latitude = mapState.latitude, height = mapState.height, width = mapState.width, zoom = mapState.zoom, pitch = mapState.pitch, bearing = mapState.bearing; boundingBox = _geoViewport["default"].bounds([longitude, latitude], zoom, [width, height]); var viewport = new _viewportMercatorProject["default"]({ width: width, height: height, longitude: longitude, latitude: latitude, zoom: zoom, pitch: pitch, bearing: bearing }); cUL = viewport.unproject([0, 0]); cUR = viewport.unproject([width, 0]); cLR = viewport.unproject([width, height]); cLL = viewport.unproject([0, height]); latRange = (0, _toConsumableArray2["default"])(new Set([cLL[1], cUR[1], cLR[1], cUL[1]])).sort(function (a, b) { return a - b; }); lngRange = (0, _toConsumableArray2["default"])(new Set([cLL[0], cUR[0], cLR[0], cUL[0]])).sort(function (a, b) { return a - b; }); var boundingPolygon = { type: 'Polygon', coordinates: [[cUL, cUR, cLR, cLL]], crs: { type: 'name', properties: { name: 'EPSG:4326' } } }; if ((0, _fileHandler.getFileType)(label) !== 'json' && boundingBox) { var latIdx = state.layers[idx].config.columns.lat.fieldIdx; var lngIdx = state.layers[idx].config.columns.lng.fieldIdx; data = data.filter(function (d) { return pitch || bearing ? !(0, _booleanDisjoint["default"])((0, _helpers.point)([d[lngIdx], d[latIdx]]), boundingPolygon) : d[latIdx] > latRange[0] && d[latIdx] < latRange[1] && d[lngIdx] > lngRange[0] && d[lngIdx] < lngRange[1]; }); } else if (boundingBox) { if (!state.datasets[dataId].simplifiedGeoJSON) { state = _objectSpread({}, state, { datasets: _objectSpread({}, state.datasets, (0, _defineProperty2["default"])({}, dataId, _objectSpread({}, state.datasets[dataId], { simplifiedGeoJSON: data.map(function (d) { return [].concat((0, _toConsumableArray2["default"])(d), [d[0] = (0, _simplifyGeojson["default"])(d[0], 0.01)]); }) }))) }); } data = state.datasets[dataId].simplifiedGeoJSON.filter(function (d) { return !(0, _booleanDisjoint["default"])(d[0], boundingPolygon); }); } } var categories = data.reduce(function (acc, curr, idx) { if (acc[curr[categoryFieldIdx]] === undefined) acc[curr[categoryFieldIdx]] = aggregationType === 'count' ? [1] : [curr[fieldIdx]];else acc[curr[categoryFieldIdx]].push(aggregationType === 'count' ? 1 : curr[fieldIdx]); return acc; }, {}); for (var category in categories) { sortableCategories.push([category, (0, _aggregateUtils.aggregate)(categories[category], aggregationType)]); } sortableCategories = sortableCategories.sort(function (a, b) { return b[1] - a[1]; }); sortableCategories.length = 5; sortableCategories = sortableCategories.map(function (sc) { return { y: sc[0], x: sc[1] }; }); newWidget.config.aggregatedData = sortableCategories; return { newWidget: newWidget, updatedState: state }; } }, { key: "type", get: function get() { return 'Category'; } }, { key: "isAggregated", get: function get() { return false; } }, { key: "widgetIcon", get: function get() { return _categoryWidgetIcon["default"]; } }, { key: "widgetAggregatedData", get: function get() { return null; } }]); return FunctionWidget; }(_baseWidget["default"]); exports["default"] = FunctionWidget; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93aWRnZXRzL2NhdGVnb3J5LXdpZGdldC9jYXRlZ29yeS13aWRnZXQuanMiXSwibmFtZXMiOlsiRnVuY3Rpb25XaWRnZXQiLCJwcm9wcyIsIm5ld1dpZGdldCIsInN0YXRlIiwibWFwU3RhdGUiLCJjb25maWciLCJkYXRhSWQiLCJhZ2dyZWdhdGlvblR5cGUiLCJib3VuZHMiLCJkYXRhc2V0cyIsImRhdGEiLCJsYWJlbCIsInNvcnRhYmxlQ2F0ZWdvcmllcyIsImZpZWxkcyIsImNhdGVnb3J5RmllbGQiLCJmaWVsZE5hbWUiLCJjYXRlZ29yeUZpZWxkSWR4IiwiZmluZEluZGV4IiwiZiIsIm5hbWUiLCJmaWVsZElkeCIsImJvdW5kaW5nQm94IiwiY1VMIiwiY1VSIiwiY0xMIiwiY0xSIiwibGF0UmFuZ2UiLCJsbmdSYW5nZSIsInNlbGVjdGVkTGF5ZXIiLCJpZHgiLCJsYXllcnMiLCJsIiwiaWQiLCJ1cGRhdGVkU3RhdGUiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwiem9vbSIsInBpdGNoIiwiYmVhcmluZyIsImdlb1ZpZXdwb3J0Iiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwidW5wcm9qZWN0IiwiU2V0Iiwic29ydCIsImEiLCJiIiwiYm91bmRpbmdQb2x5Z29uIiwidHlwZSIsImNvb3JkaW5hdGVzIiwiY3JzIiwicHJvcGVydGllcyIsImxhdElkeCIsImNvbHVtbnMiLCJsYXQiLCJsbmdJZHgiLCJsbmciLCJmaWx0ZXIiLCJkIiwic2ltcGxpZmllZEdlb0pTT04iLCJtYXAiLCJjYXRlZ29yaWVzIiwicmVkdWNlIiwiYWNjIiwiY3VyciIsInVuZGVmaW5lZCIsInB1c2giLCJjYXRlZ29yeSIsImxlbmd0aCIsInNjIiwieSIsIngiLCJhZ2dyZWdhdGVkRGF0YSIsIkNhdGVnb3J5V2lkZ2V0SWNvbiIsIldpZGdldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztJQUVxQkEsYzs7Ozs7QUFDbkIsMEJBQVlDLEtBQVosRUFBbUI7QUFBQTtBQUFBLHlIQUNYQSxLQURXO0FBRWxCOzs7OzZDQWN3QkMsUyxFQUFXQyxLLEVBQU9DLFEsRUFBVTtBQUFBLDhCQUNURixTQUFTLENBQUNHLE1BREQ7QUFBQSxVQUM1Q0MsTUFENEMscUJBQzVDQSxNQUQ0QztBQUFBLFVBQ3BDQyxlQURvQyxxQkFDcENBLGVBRG9DO0FBQUEsVUFDbkJDLE1BRG1CLHFCQUNuQkEsTUFEbUI7QUFBQSxrQ0FFL0JMLEtBQUssQ0FBQ00sUUFBTixDQUFlSCxNQUFmLENBRitCO0FBQUEsVUFFOUNJLElBRjhDLHlCQUU5Q0EsSUFGOEM7QUFBQSxVQUV4Q0MsS0FGd0MseUJBRXhDQSxLQUZ3QztBQUduRCxVQUFJQyxrQkFBa0IsR0FBRyxFQUF6QjtBQUhtRCxVQUk1Q0MsTUFKNEMsR0FJbENWLEtBQUssQ0FBQ00sUUFBTixDQUFlSCxNQUFmLENBSmtDLENBSTVDTyxNQUo0QztBQUtuRCxVQUFNQyxhQUFhLEdBQUdaLFNBQVMsQ0FBQ0csTUFBVixDQUFpQlMsYUFBdkM7QUFDQSxVQUFNQyxTQUFTLEdBQUdiLFNBQVMsQ0FBQ0csTUFBVixDQUFpQlUsU0FBbkM7QUFDQSxVQUFNQyxnQkFBZ0IsR0FBR0gsTUFBTSxDQUFDSSxTQUFQLENBQWlCLFVBQUFDLENBQUM7QUFBQSxlQUFJQSxDQUFDLENBQUNDLElBQUYsS0FBV0wsYUFBZjtBQUFBLE9BQWxCLENBQXpCO0FBQ0EsVUFBTU0sUUFBUSxHQUFHUCxNQUFNLENBQUNJLFNBQVAsQ0FBaUIsVUFBQUMsQ0FBQztBQUFBLGVBQUlBLENBQUMsQ0FBQ0MsSUFBRixLQUFXSixTQUFmO0FBQUEsT0FBbEIsQ0FBakI7QUFDQSxVQUFJTSxXQUFKO0FBQ0EsVUFBSUMsR0FBSixFQUFTQyxHQUFULEVBQWNDLEdBQWQsRUFBbUJDLEdBQW5CO0FBQ0EsVUFBSUMsUUFBSixFQUFjQyxRQUFkOztBQUVBLFVBQUksQ0FBQ3pCLFNBQVMsQ0FBQ0csTUFBVixDQUFpQnVCLGFBQXRCLEVBQXFDO0FBQ25DLGVBQU8xQixTQUFQO0FBQ0Q7O0FBRUQsVUFBTTJCLEdBQUcsR0FBRzFCLEtBQUssQ0FBQzJCLE1BQU4sQ0FBYWIsU0FBYixDQUNWLFVBQUFjLENBQUM7QUFBQSxlQUFJQSxDQUFDLENBQUNDLEVBQUYsS0FBUzlCLFNBQVMsQ0FBQ0csTUFBVixDQUFpQnVCLGFBQWpCLENBQStCSSxFQUE1QztBQUFBLE9BRFMsQ0FBWjtBQUdBLFVBQUksQ0FBQ3pCLGVBQUQsSUFBcUJBLGVBQWUsS0FBSyxPQUFwQixJQUErQmEsUUFBUSxJQUFJLENBQXBFLEVBQ0UsT0FBTztBQUFDbEIsUUFBQUEsU0FBUyxFQUFUQSxTQUFEO0FBQVkrQixRQUFBQSxZQUFZLEVBQUU5QjtBQUExQixPQUFQOztBQUVGLFVBQUlDLFFBQVEsSUFBSUksTUFBaEIsRUFBd0I7QUFBQSxZQUVwQjBCLFNBRm9CLEdBU2xCOUIsUUFUa0IsQ0FFcEI4QixTQUZvQjtBQUFBLFlBR3BCQyxRQUhvQixHQVNsQi9CLFFBVGtCLENBR3BCK0IsUUFIb0I7QUFBQSxZQUlwQkMsTUFKb0IsR0FTbEJoQyxRQVRrQixDQUlwQmdDLE1BSm9CO0FBQUEsWUFLcEJDLEtBTG9CLEdBU2xCakMsUUFUa0IsQ0FLcEJpQyxLQUxvQjtBQUFBLFlBTXBCQyxJQU5vQixHQVNsQmxDLFFBVGtCLENBTXBCa0MsSUFOb0I7QUFBQSxZQU9wQkMsS0FQb0IsR0FTbEJuQyxRQVRrQixDQU9wQm1DLEtBUG9CO0FBQUEsWUFRcEJDLE9BUm9CLEdBU2xCcEMsUUFUa0IsQ0FRcEJvQyxPQVJvQjtBQVd0Qm5CLFFBQUFBLFdBQVcsR0FBR29CLHdCQUFZakMsTUFBWixDQUFtQixDQUFDMEIsU0FBRCxFQUFZQyxRQUFaLENBQW5CLEVBQTBDRyxJQUExQyxFQUFnRCxDQUM1REQsS0FENEQsRUFFNURELE1BRjRELENBQWhELENBQWQ7QUFLQSxZQUFNTSxRQUFRLEdBQUcsSUFBSUMsbUNBQUosQ0FBd0I7QUFDdkNOLFVBQUFBLEtBQUssRUFBRUEsS0FEZ0M7QUFFdkNELFVBQUFBLE1BQU0sRUFBRUEsTUFGK0I7QUFHdkNGLFVBQUFBLFNBQVMsRUFBRUEsU0FINEI7QUFJdkNDLFVBQUFBLFFBQVEsRUFBRUEsUUFKNkI7QUFLdkNHLFVBQUFBLElBQUksRUFBRUEsSUFMaUM7QUFNdkNDLFVBQUFBLEtBQUssRUFBRUEsS0FOZ0M7QUFPdkNDLFVBQUFBLE9BQU8sRUFBRUE7QUFQOEIsU0FBeEIsQ0FBakI7QUFTQWxCLFFBQUFBLEdBQUcsR0FBR29CLFFBQVEsQ0FBQ0UsU0FBVCxDQUFtQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQW5CLENBQU47QUFDQXJCLFFBQUFBLEdBQUcsR0FBR21CLFFBQVEsQ0FBQ0UsU0FBVCxDQUFtQixDQUFDUCxLQUFELEVBQVEsQ0FBUixDQUFuQixDQUFOO0FBQ0FaLFFBQUFBLEdBQUcsR0FBR2lCLFFBQVEsQ0FBQ0UsU0FBVCxDQUFtQixDQUFDUCxLQUFELEVBQVFELE1BQVIsQ0FBbkIsQ0FBTjtBQUNBWixRQUFBQSxHQUFHLEdBQUdrQixRQUFRLENBQUNFLFNBQVQsQ0FBbUIsQ0FBQyxDQUFELEVBQUlSLE1BQUosQ0FBbkIsQ0FBTjtBQUVBVixRQUFBQSxRQUFRLEdBQUcsb0NBQUksSUFBSW1CLEdBQUosQ0FBUSxDQUFDckIsR0FBRyxDQUFDLENBQUQsQ0FBSixFQUFTRCxHQUFHLENBQUMsQ0FBRCxDQUFaLEVBQWlCRSxHQUFHLENBQUMsQ0FBRCxDQUFwQixFQUF5QkgsR0FBRyxDQUFDLENBQUQsQ0FBNUIsQ0FBUixDQUFKLEVBQStDd0IsSUFBL0MsQ0FDVCxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxpQkFBVUQsQ0FBQyxHQUFHQyxDQUFkO0FBQUEsU0FEUyxDQUFYO0FBR0FyQixRQUFBQSxRQUFRLEdBQUcsb0NBQUksSUFBSWtCLEdBQUosQ0FBUSxDQUFDckIsR0FBRyxDQUFDLENBQUQsQ0FBSixFQUFTRCxHQUFHLENBQUMsQ0FBRCxDQUFaLEVBQWlCRSxHQUFHLENBQUMsQ0FBRCxDQUFwQixFQUF5QkgsR0FBRyxDQUFDLENBQUQsQ0FBNUIsQ0FBUixDQUFKLEVBQStDd0IsSUFBL0MsQ0FDVCxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxpQkFBVUQsQ0FBQyxHQUFHQyxDQUFkO0FBQUEsU0FEUyxDQUFYO0FBSUEsWUFBTUMsZUFBZSxHQUFHO0FBQ3RCQyxVQUFBQSxJQUFJLEVBQUUsU0FEZ0I7QUFFdEJDLFVBQUFBLFdBQVcsRUFBRSxDQUFDLENBQUM3QixHQUFELEVBQU1DLEdBQU4sRUFBV0UsR0FBWCxFQUFnQkQsR0FBaEIsQ0FBRCxDQUZTO0FBR3RCNEIsVUFBQUEsR0FBRyxFQUFFO0FBQ0hGLFlBQUFBLElBQUksRUFBRSxNQURIO0FBRUhHLFlBQUFBLFVBQVUsRUFBRTtBQUNWbEMsY0FBQUEsSUFBSSxFQUFFO0FBREk7QUFGVDtBQUhpQixTQUF4Qjs7QUFXQSxZQUFJLDhCQUFZUixLQUFaLE1BQXVCLE1BQXZCLElBQWlDVSxXQUFyQyxFQUFrRDtBQUNoRCxjQUFNaUMsTUFBTSxHQUFHbkQsS0FBSyxDQUFDMkIsTUFBTixDQUFhRCxHQUFiLEVBQWtCeEIsTUFBbEIsQ0FBeUJrRCxPQUF6QixDQUFpQ0MsR0FBakMsQ0FBcUNwQyxRQUFwRDtBQUNBLGNBQU1xQyxNQUFNLEdBQUd0RCxLQUFLLENBQUMyQixNQUFOLENBQWFELEdBQWIsRUFBa0J4QixNQUFsQixDQUF5QmtELE9BQXpCLENBQWlDRyxHQUFqQyxDQUFxQ3RDLFFBQXBEO0FBQ0FWLFVBQUFBLElBQUksR0FBR0EsSUFBSSxDQUFDaUQsTUFBTCxDQUFZLFVBQUFDLENBQUM7QUFBQSxtQkFDbEJyQixLQUFLLElBQUlDLE9BQVQsR0FDSSxDQUFDLGlDQUFnQixvQkFBTSxDQUFDb0IsQ0FBQyxDQUFDSCxNQUFELENBQUYsRUFBWUcsQ0FBQyxDQUFDTixNQUFELENBQWIsQ0FBTixDQUFoQixFQUErQ0wsZUFBL0MsQ0FETCxHQUVJVyxDQUFDLENBQUNOLE1BQUQsQ0FBRCxHQUFZNUIsUUFBUSxDQUFDLENBQUQsQ0FBcEIsSUFDQWtDLENBQUMsQ0FBQ04sTUFBRCxDQUFELEdBQVk1QixRQUFRLENBQUMsQ0FBRCxDQURwQixJQUVBa0MsQ0FBQyxDQUFDSCxNQUFELENBQUQsR0FBWTlCLFFBQVEsQ0FBQyxDQUFELENBRnBCLElBR0FpQyxDQUFDLENBQUNILE1BQUQsQ0FBRCxHQUFZOUIsUUFBUSxDQUFDLENBQUQsQ0FOTjtBQUFBLFdBQWIsQ0FBUDtBQVFELFNBWEQsTUFXTyxJQUFJTixXQUFKLEVBQWlCO0FBQ3RCLGNBQUksQ0FBQ2xCLEtBQUssQ0FBQ00sUUFBTixDQUFlSCxNQUFmLEVBQXVCdUQsaUJBQTVCLEVBQStDO0FBQzdDMUQsWUFBQUEsS0FBSyxxQkFDQUEsS0FEQTtBQUVITSxjQUFBQSxRQUFRLG9CQUNITixLQUFLLENBQUNNLFFBREgsdUNBRUxILE1BRkssb0JBR0RILEtBQUssQ0FBQ00sUUFBTixDQUFlSCxNQUFmLENBSEM7QUFJSnVELGdCQUFBQSxpQkFBaUIsRUFBRW5ELElBQUksQ0FBQ29ELEdBQUwsQ0FBUyxVQUFBRixDQUFDO0FBQUEsdUVBQ3hCQSxDQUR3QixJQUUxQkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPLGlDQUFTQSxDQUFDLENBQUMsQ0FBRCxDQUFWLEVBQWUsSUFBZixDQUZtQjtBQUFBLGlCQUFWO0FBSmY7QUFGTCxjQUFMO0FBYUQ7O0FBRURsRCxVQUFBQSxJQUFJLEdBQUdQLEtBQUssQ0FBQ00sUUFBTixDQUFlSCxNQUFmLEVBQXVCdUQsaUJBQXZCLENBQXlDRixNQUF6QyxDQUNMLFVBQUFDLENBQUM7QUFBQSxtQkFBSSxDQUFDLGlDQUFnQkEsQ0FBQyxDQUFDLENBQUQsQ0FBakIsRUFBc0JYLGVBQXRCLENBQUw7QUFBQSxXQURJLENBQVA7QUFHRDtBQUNGOztBQUVELFVBQU1jLFVBQVUsR0FBR3JELElBQUksQ0FBQ3NELE1BQUwsQ0FBWSxVQUFDQyxHQUFELEVBQU1DLElBQU4sRUFBWXJDLEdBQVosRUFBb0I7QUFDakQsWUFBSW9DLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDbEQsZ0JBQUQsQ0FBTCxDQUFILEtBQWdDbUQsU0FBcEMsRUFDRUYsR0FBRyxDQUFDQyxJQUFJLENBQUNsRCxnQkFBRCxDQUFMLENBQUgsR0FDRVQsZUFBZSxLQUFLLE9BQXBCLEdBQThCLENBQUMsQ0FBRCxDQUE5QixHQUFvQyxDQUFDMkQsSUFBSSxDQUFDOUMsUUFBRCxDQUFMLENBRHRDLENBREYsS0FJRTZDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDbEQsZ0JBQUQsQ0FBTCxDQUFILENBQTRCb0QsSUFBNUIsQ0FDRTdELGVBQWUsS0FBSyxPQUFwQixHQUE4QixDQUE5QixHQUFrQzJELElBQUksQ0FBQzlDLFFBQUQsQ0FEeEM7QUFHRixlQUFPNkMsR0FBUDtBQUNELE9BVGtCLEVBU2hCLEVBVGdCLENBQW5COztBQVVBLFdBQUssSUFBSUksUUFBVCxJQUFxQk4sVUFBckIsRUFBaUM7QUFDL0JuRCxRQUFBQSxrQkFBa0IsQ0FBQ3dELElBQW5CLENBQXdCLENBQ3RCQyxRQURzQixFQUV0QiwrQkFBVU4sVUFBVSxDQUFDTSxRQUFELENBQXBCLEVBQWdDOUQsZUFBaEMsQ0FGc0IsQ0FBeEI7QUFJRDs7QUFFREssTUFBQUEsa0JBQWtCLEdBQUdBLGtCQUFrQixDQUFDa0MsSUFBbkIsQ0FBd0IsVUFBU0MsQ0FBVCxFQUFZQyxDQUFaLEVBQWU7QUFDMUQsZUFBT0EsQ0FBQyxDQUFDLENBQUQsQ0FBRCxHQUFPRCxDQUFDLENBQUMsQ0FBRCxDQUFmO0FBQ0QsT0FGb0IsQ0FBckI7QUFHQW5DLE1BQUFBLGtCQUFrQixDQUFDMEQsTUFBbkIsR0FBNEIsQ0FBNUI7QUFDQTFELE1BQUFBLGtCQUFrQixHQUFHQSxrQkFBa0IsQ0FBQ2tELEdBQW5CLENBQXVCLFVBQUFTLEVBQUUsRUFBSTtBQUNoRCxlQUFPO0FBQUNDLFVBQUFBLENBQUMsRUFBRUQsRUFBRSxDQUFDLENBQUQsQ0FBTjtBQUFXRSxVQUFBQSxDQUFDLEVBQUVGLEVBQUUsQ0FBQyxDQUFEO0FBQWhCLFNBQVA7QUFDRCxPQUZvQixDQUFyQjtBQUlBckUsTUFBQUEsU0FBUyxDQUFDRyxNQUFWLENBQWlCcUUsY0FBakIsR0FBa0M5RCxrQkFBbEM7QUFDQSxhQUFPO0FBQUNWLFFBQUFBLFNBQVMsRUFBVEEsU0FBRDtBQUFZK0IsUUFBQUEsWUFBWSxFQUFFOUI7QUFBMUIsT0FBUDtBQUNEOzs7d0JBakpVO0FBQ1QsYUFBTyxVQUFQO0FBQ0Q7Ozt3QkFDa0I7QUFDakIsYUFBTyxLQUFQO0FBQ0Q7Ozt3QkFDZ0I7QUFDZixhQUFPd0UsOEJBQVA7QUFDRDs7O3dCQUMwQjtBQUN6QixhQUFPLElBQVA7QUFDRDs7O0VBZnlDQyxzQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBXaWRnZXQgZnJvbSAnLi4vYmFzZS13aWRnZXQnO1xuaW1wb3J0IENhdGVnb3J5V2lkZ2V0SWNvbiBmcm9tICcuL2NhdGVnb3J5LXdpZGdldC1pY29uJztcbmltcG9ydCB7YWdncmVnYXRlfSBmcm9tICcuLi8uLi91dGlscy9hZ2dyZWdhdGUtdXRpbHMnO1xuaW1wb3J0IGdlb1ZpZXdwb3J0IGZyb20gJ0BtYXBib3gvZ2VvLXZpZXdwb3J0JztcbmltcG9ydCBXZWJNZXJjYXRvclZpZXdwb3J0IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHtnZXRGaWxlVHlwZX0gZnJvbSAncHJvY2Vzc29ycy9maWxlLWhhbmRsZXInO1xuaW1wb3J0IGJvb2xlYW5EaXNqb2ludCBmcm9tICdAdHVyZi9ib29sZWFuLWRpc2pvaW50JztcbmltcG9ydCB7cG9pbnQsIHBvbHlnb259IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuLy8gaW1wb3J0IHNpbXBsaWZ5IGZyb20gJ0B0dXJmL3NpbXBsaWZ5JztcbmltcG9ydCBzaW1wbGlmeSBmcm9tICdzaW1wbGlmeS1nZW9qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnVuY3Rpb25XaWRnZXQgZXh0ZW5kcyBXaWRnZXQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ0NhdGVnb3J5JztcbiAgfVxuICBnZXQgaXNBZ2dyZWdhdGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgd2lkZ2V0SWNvbigpIHtcbiAgICByZXR1cm4gQ2F0ZWdvcnlXaWRnZXRJY29uO1xuICB9XG4gIGdldCB3aWRnZXRBZ2dyZWdhdGVkRGF0YSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YShuZXdXaWRnZXQsIHN0YXRlLCBtYXBTdGF0ZSkge1xuICAgIGNvbnN0IHtkYXRhSWQsIGFnZ3JlZ2F0aW9uVHlwZSwgYm91bmRzfSA9IG5ld1dpZGdldC5jb25maWc7XG4gICAgdmFyIHtkYXRhLCBsYWJlbH0gPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICAgIGxldCBzb3J0YWJsZUNhdGVnb3JpZXMgPSBbXTtcbiAgICBjb25zdCB7ZmllbGRzfSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gICAgY29uc3QgY2F0ZWdvcnlGaWVsZCA9IG5ld1dpZGdldC5jb25maWcuY2F0ZWdvcnlGaWVsZDtcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBuZXdXaWRnZXQuY29uZmlnLmZpZWxkTmFtZTtcbiAgICBjb25zdCBjYXRlZ29yeUZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY2F0ZWdvcnlGaWVsZCk7XG4gICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgIGxldCBib3VuZGluZ0JveDtcbiAgICBsZXQgY1VMLCBjVVIsIGNMTCwgY0xSO1xuICAgIGxldCBsYXRSYW5nZSwgbG5nUmFuZ2U7XG5cbiAgICBpZiAoIW5ld1dpZGdldC5jb25maWcuc2VsZWN0ZWRMYXllcikge1xuICAgICAgcmV0dXJuIG5ld1dpZGdldDtcbiAgICB9XG5cbiAgICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KFxuICAgICAgbCA9PiBsLmlkID09PSBuZXdXaWRnZXQuY29uZmlnLnNlbGVjdGVkTGF5ZXIuaWRcbiAgICApO1xuICAgIGlmICghYWdncmVnYXRpb25UeXBlIHx8IChhZ2dyZWdhdGlvblR5cGUgIT09ICdjb3VudCcgJiYgZmllbGRJZHggPD0gMCkpXG4gICAgICByZXR1cm4ge25ld1dpZGdldCwgdXBkYXRlZFN0YXRlOiBzdGF0ZX07XG5cbiAgICBpZiAobWFwU3RhdGUgJiYgYm91bmRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGUsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIHpvb20sXG4gICAgICAgIHBpdGNoLFxuICAgICAgICBiZWFyaW5nXG4gICAgICB9ID0gbWFwU3RhdGU7XG5cbiAgICAgIGJvdW5kaW5nQm94ID0gZ2VvVmlld3BvcnQuYm91bmRzKFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgem9vbSwgW1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICBdKTtcblxuICAgICAgY29uc3Qgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgIHpvb206IHpvb20sXG4gICAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgICAgYmVhcmluZzogYmVhcmluZ1xuICAgICAgfSk7XG4gICAgICBjVUwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIDBdKTtcbiAgICAgIGNVUiA9IHZpZXdwb3J0LnVucHJvamVjdChbd2lkdGgsIDBdKTtcbiAgICAgIGNMUiA9IHZpZXdwb3J0LnVucHJvamVjdChbd2lkdGgsIGhlaWdodF0pO1xuICAgICAgY0xMID0gdmlld3BvcnQudW5wcm9qZWN0KFswLCBoZWlnaHRdKTtcblxuICAgICAgbGF0UmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzFdLCBjVVJbMV0sIGNMUlsxXSwgY1VMWzFdXSldLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYlxuICAgICAgKTtcbiAgICAgIGxuZ1JhbmdlID0gWy4uLm5ldyBTZXQoW2NMTFswXSwgY1VSWzBdLCBjTFJbMF0sIGNVTFswXV0pXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYSAtIGJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGJvdW5kaW5nUG9seWdvbiA9IHtcbiAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICBjb29yZGluYXRlczogW1tjVUwsIGNVUiwgY0xSLCBjTExdXSxcbiAgICAgICAgY3JzOiB7XG4gICAgICAgICAgdHlwZTogJ25hbWUnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6ICdFUFNHOjQzMjYnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoZ2V0RmlsZVR5cGUobGFiZWwpICE9PSAnanNvbicgJiYgYm91bmRpbmdCb3gpIHtcbiAgICAgICAgY29uc3QgbGF0SWR4ID0gc3RhdGUubGF5ZXJzW2lkeF0uY29uZmlnLmNvbHVtbnMubGF0LmZpZWxkSWR4O1xuICAgICAgICBjb25zdCBsbmdJZHggPSBzdGF0ZS5sYXllcnNbaWR4XS5jb25maWcuY29sdW1ucy5sbmcuZmllbGRJZHg7XG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihkID0+XG4gICAgICAgICAgcGl0Y2ggfHwgYmVhcmluZ1xuICAgICAgICAgICAgPyAhYm9vbGVhbkRpc2pvaW50KHBvaW50KFtkW2xuZ0lkeF0sIGRbbGF0SWR4XV0pLCBib3VuZGluZ1BvbHlnb24pXG4gICAgICAgICAgICA6IGRbbGF0SWR4XSA+IGxhdFJhbmdlWzBdICYmXG4gICAgICAgICAgICAgIGRbbGF0SWR4XSA8IGxhdFJhbmdlWzFdICYmXG4gICAgICAgICAgICAgIGRbbG5nSWR4XSA+IGxuZ1JhbmdlWzBdICYmXG4gICAgICAgICAgICAgIGRbbG5nSWR4XSA8IGxuZ1JhbmdlWzFdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGJvdW5kaW5nQm94KSB7XG4gICAgICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTikge1xuICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXRhc2V0czoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAgICAgICAgICAgW2RhdGFJZF06IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRHZW9KU09OOiBkYXRhLm1hcChkID0+IFtcbiAgICAgICAgICAgICAgICAgIC4uLmQsXG4gICAgICAgICAgICAgICAgICAoZFswXSA9IHNpbXBsaWZ5KGRbMF0sIDAuMDEpKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04uZmlsdGVyKFxuICAgICAgICAgIGQgPT4gIWJvb2xlYW5EaXNqb2ludChkWzBdLCBib3VuZGluZ1BvbHlnb24pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2F0ZWdvcmllcyA9IGRhdGEucmVkdWNlKChhY2MsIGN1cnIsIGlkeCkgPT4ge1xuICAgICAgaWYgKGFjY1tjdXJyW2NhdGVnb3J5RmllbGRJZHhdXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBhY2NbY3VycltjYXRlZ29yeUZpZWxkSWR4XV0gPVxuICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IFsxXSA6IFtjdXJyW2ZpZWxkSWR4XV07XG4gICAgICBlbHNlXG4gICAgICAgIGFjY1tjdXJyW2NhdGVnb3J5RmllbGRJZHhdXS5wdXNoKFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IDEgOiBjdXJyW2ZpZWxkSWR4XVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gICAgZm9yICh2YXIgY2F0ZWdvcnkgaW4gY2F0ZWdvcmllcykge1xuICAgICAgc29ydGFibGVDYXRlZ29yaWVzLnB1c2goW1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgYWdncmVnYXRlKGNhdGVnb3JpZXNbY2F0ZWdvcnldLCBhZ2dyZWdhdGlvblR5cGUpXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBzb3J0YWJsZUNhdGVnb3JpZXMgPSBzb3J0YWJsZUNhdGVnb3JpZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gYlsxXSAtIGFbMV07XG4gICAgfSk7XG4gICAgc29ydGFibGVDYXRlZ29yaWVzLmxlbmd0aCA9IDU7XG4gICAgc29ydGFibGVDYXRlZ29yaWVzID0gc29ydGFibGVDYXRlZ29yaWVzLm1hcChzYyA9PiB7XG4gICAgICByZXR1cm4ge3k6IHNjWzBdLCB4OiBzY1sxXX07XG4gICAgfSk7XG5cbiAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gc29ydGFibGVDYXRlZ29yaWVzO1xuICAgIHJldHVybiB7bmV3V2lkZ2V0LCB1cGRhdGVkU3RhdGU6IHN0YXRlfTtcbiAgfVxufVxuIl19