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
JavaScript
;
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93aWRnZXRzL2NhdGVnb3J5LXdpZGdldC9jYXRlZ29yeS13aWRnZXQuanMiXSwibmFtZXMiOlsiRnVuY3Rpb25XaWRnZXQiLCJwcm9wcyIsIm5ld1dpZGdldCIsInN0YXRlIiwibWFwU3RhdGUiLCJjb25maWciLCJkYXRhSWQiLCJhZ2dyZWdhdGlvblR5cGUiLCJib3VuZHMiLCJkYXRhc2V0cyIsImRhdGEiLCJsYWJlbCIsInNvcnRhYmxlQ2F0ZWdvcmllcyIsImZpZWxkcyIsImNhdGVnb3J5RmllbGQiLCJmaWVsZE5hbWUiLCJjYXRlZ29yeUZpZWxkSWR4IiwiZmluZEluZGV4IiwiZiIsIm5hbWUiLCJmaWVsZElkeCIsImJvdW5kaW5nQm94IiwiY1VMIiwiY1VSIiwiY0xMIiwiY0xSIiwibGF0UmFuZ2UiLCJsbmdSYW5nZSIsInNlbGVjdGVkTGF5ZXIiLCJpZHgiLCJsYXllcnMiLCJsIiwiaWQiLCJ1cGRhdGVkU3RhdGUiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwiem9vbSIsInBpdGNoIiwiYmVhcmluZyIsImdlb1ZpZXdwb3J0Iiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwidW5wcm9qZWN0IiwiU2V0Iiwic29ydCIsImEiLCJiIiwiYm91bmRpbmdQb2x5Z29uIiwidHlwZSIsImNvb3JkaW5hdGVzIiwiY3JzIiwicHJvcGVydGllcyIsImxhdElkeCIsImNvbHVtbnMiLCJsYXQiLCJsbmdJZHgiLCJsbmciLCJmaWx0ZXIiLCJkIiwic2ltcGxpZmllZEdlb0pTT04iLCJtYXAiLCJjYXRlZ29yaWVzIiwicmVkdWNlIiwiYWNjIiwiY3VyciIsInVuZGVmaW5lZCIsInB1c2giLCJjYXRlZ29yeSIsImxlbmd0aCIsInNjIiwieSIsIngiLCJhZ2dyZWdhdGVkRGF0YSIsIkNhdGVnb3J5V2lkZ2V0SWNvbiIsIldpZGdldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFv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QUlBckUsTUFBQUEsU0FBUyxDQUFDRyxNQUFWLENBQWlCcUUsY0FBakIsR0FBa0M5RCxrQkFBbEM7QUFDQSxhQUFPO0FBQUNWLFFBQUFBLFNBQVMsRUFBVEEsU0FBRDtBQUFZK0IsUUFBQUEsWUFBWSxFQUFFOUI7QUFBMUIsT0FBUDtBQUNEOzs7d0JBakpVO0FBQ1QsYUFBTyxVQUFQO0FBQ0Q7Ozt3QkFDa0I7QUFDakIsYUFBTyxLQUFQO0FBQ0Q7Ozt3QkFDZ0I7QUFDZixhQUFPd0UsOEJBQVA7QUFDRDs7O3dCQUMwQjtBQUN6QixhQUFPLElBQVA7QUFDRDs7O0VBZnlDQyxzQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBXaWRnZXQgZnJvbSAnLi4vYmFzZS13aWRnZXQnO1xuaW1wb3J0IENhdGVnb3J5V2lkZ2V0SWNvbiBmcm9tICcuL2NhdGVnb3J5LXdpZGdldC1pY29uJztcbmltcG9ydCB7YWdncmVnYXRlfSBmcm9tICcuLi8uLi91dGlscy9hZ2dyZWdhdGUtdXRpbHMnO1xuaW1wb3J0IGdlb1ZpZXdwb3J0IGZyb20gJ0BtYXBib3gvZ2VvLXZpZXdwb3J0JztcbmltcG9ydCBXZWJNZXJjYXRvclZpZXdwb3J0IGZyb20gJ3ZpZXdwb3J0LW1lcmNhdG9yLXByb2plY3QnO1xuaW1wb3J0IHtnZXRGaWxlVHlwZX0gZnJvbSAncHJvY2Vzc29ycy9maWxlLWhhbmRsZXInO1xuaW1wb3J0IGJvb2xlYW5EaXNqb2ludCBmcm9tICdAdHVyZi9ib29sZWFuLWRpc2pvaW50JztcbmltcG9ydCB7cG9pbnQsIHBvbHlnb259IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuLy8gaW1wb3J0IHNpbXBsaWZ5IGZyb20gJ0B0dXJmL3NpbXBsaWZ5JztcbmltcG9ydCBzaW1wbGlmeSBmcm9tICdzaW1wbGlmeS1nZW9qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnVuY3Rpb25XaWRnZXQgZXh0ZW5kcyBXaWRnZXQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ0NhdGVnb3J5JztcbiAgfVxuICBnZXQgaXNBZ2dyZWdhdGVkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgd2lkZ2V0SWNvbigpIHtcbiAgICByZXR1cm4gQ2F0ZWdvcnlXaWRnZXRJY29uO1xuICB9XG4gIGdldCB3aWRnZXRBZ2dyZWdhdGVkRGF0YSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YShuZXdXaWRnZXQsIHN0YXRlLCBtYXBTdGF0ZSkge1xuICAgIGNvbnN0IHtkYXRhSWQsIGFnZ3JlZ2F0aW9uVHlwZSwgYm91bmRzfSA9IG5ld1dpZGdldC5jb25maWc7XG4gICAgdmFyIHtkYXRhLCBsYWJlbH0gPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICAgIGxldCBzb3J0YWJsZUNhdGVnb3JpZXMgPSBbXTtcbiAgICBjb25zdCB7ZmllbGRzfSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gICAgY29uc3QgY2F0ZWdvcnlGaWVsZCA9IG5ld1dpZGdldC5jb25maWcuY2F0ZWdvcnlGaWVsZDtcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBuZXdXaWRnZXQuY29uZmlnLmZpZWxkTmFtZTtcbiAgICBjb25zdCBjYXRlZ29yeUZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY2F0ZWdvcnlGaWVsZCk7XG4gICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgIGxldCBib3VuZGluZ0JveDtcbiAgICBsZXQgY1VMLCBjVVIsIGNMTCwgY0xSO1xuICAgIGxldCBsYXRSYW5nZSwgbG5nUmFuZ2U7XG5cbiAgICBpZiAoIW5ld1dpZGdldC5jb25maWcuc2VsZWN0ZWRMYXllcikge1xuICAgICAgcmV0dXJuIG5ld1dpZGdldDtcbiAgICB9XG5cbiAgICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KFxuICAgICAgbCA9PiBsLmlkID09PSBuZXdXaWRnZXQuY29uZmlnLnNlbGVjdGVkTGF5ZXIuaWRcbiAgICApO1xuICAgIGlmICghYWdncmVnYXRpb25UeXBlIHx8IChhZ2dyZWdhdGlvblR5cGUgIT09ICdjb3VudCcgJiYgZmllbGRJZHggPD0gMCkpXG4gICAgICByZXR1cm4ge25ld1dpZGdldCwgdXBkYXRlZFN0YXRlOiBzdGF0ZX07XG5cbiAgICBpZiAobWFwU3RhdGUgJiYgYm91bmRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxvbmdpdHVkZSxcbiAgICAgICAgbGF0aXR1ZGUsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIHpvb20sXG4gICAgICAgIHBpdGNoLFxuICAgICAgICBiZWFyaW5nXG4gICAgICB9ID0gbWFwU3RhdGU7XG5cbiAgICAgIGJvdW5kaW5nQm94ID0gZ2VvVmlld3BvcnQuYm91bmRzKFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgem9vbSwgW1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICBdKTtcblxuICAgICAgY29uc3Qgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlLFxuICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgIHpvb206IHpvb20sXG4gICAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgICAgYmVhcmluZzogYmVhcmluZ1xuICAgICAgfSk7XG4gICAgICBjVUwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIDBdKTtcbiAgICAgIGNVUiA9IHZpZXdwb3J0LnVucHJvamVjdChbd2lkdGgsIDBdKTtcbiAgICAgIGNMUiA9IHZpZXdwb3J0LnVucHJvamVjdChbd2lkdGgsIGhlaWdodF0pO1xuICAgICAgY0xMID0gdmlld3BvcnQudW5wcm9qZWN0KFswLCBoZWlnaHRdKTtcblxuICAgICAgbGF0UmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzFdLCBjVVJbMV0sIGNMUlsxXSwgY1VMWzFdXSldLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYlxuICAgICAgKTtcbiAgICAgIGxuZ1JhbmdlID0gWy4uLm5ldyBTZXQoW2NMTFswXSwgY1VSWzBdLCBjTFJbMF0sIGNVTFswXV0pXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYSAtIGJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGJvdW5kaW5nUG9seWdvbiA9IHtcbiAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICBjb29yZGluYXRlczogW1tjVUwsIGNVUiwgY0xSLCBjTExdXSxcbiAgICAgICAgY3JzOiB7XG4gICAgICAgICAgdHlwZTogJ25hbWUnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6ICdFUFNHOjQzMjYnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoZ2V0RmlsZVR5cGUobGFiZWwpICE9PSAnanNvbicgJiYgYm91bmRpbmdCb3gpIHtcbiAgICAgICAgY29uc3QgbGF0SWR4ID0gc3RhdGUubGF5ZXJzW2lkeF0uY29uZmlnLmNvbHVtbnMubGF0LmZpZWxkSWR4O1xuICAgICAgICBjb25zdCBsbmdJZHggPSBzdGF0ZS5sYXllcnNbaWR4XS5jb25maWcuY29sdW1ucy5sbmcuZmllbGRJZHg7XG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihkID0+XG4gICAgICAgICAgcGl0Y2ggfHwgYmVhcmluZ1xuICAgICAgICAgICAgPyAhYm9vbGVhbkRpc2pvaW50KHBvaW50KFtkW2xuZ0lkeF0sIGRbbGF0SWR4XV0pLCBib3VuZGluZ1BvbHlnb24pXG4gICAgICAgICAgICA6IGRbbGF0SWR4XSA+IGxhdFJhbmdlWzBdICYmXG4gICAgICAgICAgICAgIGRbbGF0SWR4XSA8IGxhdFJhbmdlWzFdICYmXG4gICAgICAgICAgICAgIGRbbG5nSWR4XSA+IGxuZ1JhbmdlWzBdICYmXG4gICAgICAgICAgICAgIGRbbG5nSWR4XSA8IGxuZ1JhbmdlWzFdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGJvdW5kaW5nQm94KSB7XG4gICAgICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTikge1xuICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXRhc2V0czoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAgICAgICAgICAgW2RhdGFJZF06IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRHZW9KU09OOiBkYXRhLm1hcChkID0+IFtcbiAgICAgICAgICAgICAgICAgIC4uLmQsXG4gICAgICAgICAgICAgICAgICAoZFswXSA9IHNpbXBsaWZ5KGRbMF0sIDAuMDEpKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04uZmlsdGVyKFxuICAgICAgICAgIGQgPT4gIWJvb2xlYW5EaXNqb2ludChkWzBdLCBib3VuZGluZ1BvbHlnb24pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2F0ZWdvcmllcyA9IGRhdGEucmVkdWNlKChhY2MsIGN1cnIsIGlkeCkgPT4ge1xuICAgICAgaWYgKGFjY1tjdXJyW2NhdGVnb3J5RmllbGRJZHhdXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBhY2NbY3VycltjYXRlZ29yeUZpZWxkSWR4XV0gPVxuICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IFsxXSA6IFtjdXJyW2ZpZWxkSWR4XV07XG4gICAgICBlbHNlXG4gICAgICAgIGFjY1tjdXJyW2NhdGVnb3J5RmllbGRJZHhdXS5wdXNoKFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50JyA/IDEgOiBjdXJyW2ZpZWxkSWR4XVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gICAgZm9yICh2YXIgY2F0ZWdvcnkgaW4gY2F0ZWdvcmllcykge1xuICAgICAgc29ydGFibGVDYXRlZ29yaWVzLnB1c2goW1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgYWdncmVnYXRlKGNhdGVnb3JpZXNbY2F0ZWdvcnldLCBhZ2dyZWdhdGlvblR5cGUpXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBzb3J0YWJsZUNhdGVnb3JpZXMgPSBzb3J0YWJsZUNhdGVnb3JpZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICByZXR1cm4gYlsxXSAtIGFbMV07XG4gICAgfSk7XG4gICAgc29ydGFibGVDYXRlZ29yaWVzLmxlbmd0aCA9IDU7XG4gICAgc29ydGFibGVDYXRlZ29yaWVzID0gc29ydGFibGVDYXRlZ29yaWVzLm1hcChzYyA9PiB7XG4gICAgICByZXR1cm4ge3k6IHNjWzBdLCB4OiBzY1sxXX07XG4gICAgfSk7XG5cbiAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gc29ydGFibGVDYXRlZ29yaWVzO1xuICAgIHJldHVybiB7bmV3V2lkZ2V0LCB1cGRhdGVkU3RhdGU6IHN0YXRlfTtcbiAgfVxufVxuIl19