kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
210 lines (184 loc) • 25.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.calculateAggregationData = calculateAggregationData;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _aggregateUtils = require("../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; }
// export const WIDGET_TYPES = keyMirror({
// function: null
// });
// function range(a, b) {
// if (a > b) {
// return [b, a];
// }
// return [a, b];
// }
// function flatValToPoint(arr) {
// const flatInfinityArrLength = arr.flat(Infinity).length;
// const arrLength = arr.length;
// if (arr.flat().length === flatInfinityArrLength) {
// return arr;
// } else {
// return flatValToPoint(arr.flat());
// }
// }
function calculateAggregationData(newWidget, state, mapState) {
var latRange, lngRange;
var _newWidget$config = newWidget.config,
dataId = _newWidget$config.dataId,
aggregationType = _newWidget$config.aggregationType,
bounds = _newWidget$config.bounds;
var boundingBox;
var cUL, cUR, cLL, cLR;
var _state$datasets$dataI = state.datasets[dataId],
data = _state$datasets$dataI.data,
label = _state$datasets$dataI.label;
if (!newWidget.config.selectedLayer) {
return newWidget;
}
var idx = state.layers.findIndex(function (l) {
return l.id === newWidget.config.selectedLayer.id;
});
var fields = state.datasets[dataId].fields;
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)]);
})
})))
});
} //commented part is using viewport to tell which point is in the viewport and faster than turf.js
// console.log('state inside geojson aggregation ', state);
// data = state.d atasets[dataId].simplifiedGeoJSON.filter(d =>
// d.geometry.coordinates.reduce((accu, val) => {
// var pointInsideBounds = false;
// if (accu) return accu;
// var i = 0;
// const flatVal = flatValToPoint(val);
// // if (val[i].length > 2) {
// // flatVal = val.flat();
// // }
// do {
// const p = flatVal[i];
// // console.log('point inside do while loop', p);
// if (
// viewport.project([p[0], p[1]])[0] > 0 &&
// viewport.project([p[0], p[1]])[0] < width &&
// viewport.project([p[0], p[1]])[1] > 0 &&
// viewport.project([p[0], p[1]])[1] < height
// ) {
// pointInsideBounds = true;
// }
// i++;
// } while (!pointInsideBounds && i < val.length);
// return pointInsideBounds;
// }, false)
// );
data = state.datasets[dataId].simplifiedGeoJSON.filter(function (d) {
return !(0, _booleanDisjoint["default"])(d[0], boundingPolygon);
}); // console.log(
// viewport.project([0, 0])[0] > 0 && viewport.project([0, 0])[0] < width
// );
// console.log(data.length);
// data = state.datasets[dataId].simplifiedGeoJSON.filter(
// d => !booleanDisjoint(d, boundingPolygon)
// );
// console.log(data.length);
// data = data.map(d => {
// console.log(d[0]);
// console.log();
// });
}
}
if (aggregationType === 'count') {
newWidget.config.aggregatedData = data.length;
} else {
var fieldName = newWidget.config.fieldName;
var fieldIdx = fields.findIndex(function (f) {
return f.name === fieldName;
});
if (fieldName) {
var fieldData = data.map(function (d) {
if (d.data) {
return d.data[fieldIdx];
} else {
return d[fieldIdx];
}
});
var aggregatedData = (0, _aggregateUtils.aggregate)(fieldData, aggregationType);
if (typeof aggregatedData === 'number') {
newWidget.config.aggregatedData = +aggregatedData.toFixed(2);
} else {
newWidget.config.aggregatedData = aggregatedData;
}
newWidget.config.aggregatedData;
}
} // console.log(
// 'newWidget and state inside calculateAggregationData',
// newWidget,
// state
// );
newWidget.config.isCalculating = false;
return {
newWidget: newWidget,
updatedState: state
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93aWRnZXQtdXRpbHMvd2lkZ2V0LXV0aWxzLmpzIl0sIm5hbWVzIjpbImNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YSIsIm5ld1dpZGdldCIsInN0YXRlIiwibWFwU3RhdGUiLCJsYXRSYW5nZSIsImxuZ1JhbmdlIiwiY29uZmlnIiwiZGF0YUlkIiwiYWdncmVnYXRpb25UeXBlIiwiYm91bmRzIiwiYm91bmRpbmdCb3giLCJjVUwiLCJjVVIiLCJjTEwiLCJjTFIiLCJkYXRhc2V0cyIsImRhdGEiLCJsYWJlbCIsInNlbGVjdGVkTGF5ZXIiLCJpZHgiLCJsYXllcnMiLCJmaW5kSW5kZXgiLCJsIiwiaWQiLCJmaWVsZHMiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwiem9vbSIsInBpdGNoIiwiYmVhcmluZyIsImdlb1ZpZXdwb3J0Iiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwidW5wcm9qZWN0IiwiU2V0Iiwic29ydCIsImEiLCJiIiwiYm91bmRpbmdQb2x5Z29uIiwidHlwZSIsImNvb3JkaW5hdGVzIiwiY3JzIiwicHJvcGVydGllcyIsIm5hbWUiLCJsYXRJZHgiLCJjb2x1bW5zIiwibGF0IiwiZmllbGRJZHgiLCJsbmdJZHgiLCJsbmciLCJmaWx0ZXIiLCJkIiwic2ltcGxpZmllZEdlb0pTT04iLCJtYXAiLCJhZ2dyZWdhdGVkRGF0YSIsImxlbmd0aCIsImZpZWxkTmFtZSIsImYiLCJmaWVsZERhdGEiLCJ0b0ZpeGVkIiwiaXNDYWxjdWxhdGluZyIsInVwZGF0ZWRTdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRU8sU0FB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RixPQU5lLENBQWhCO0FBT0EsVUFBTU8sY0FBYyxHQUFHLCtCQUFVSSxTQUFWLEVBQXFCcEQsZUFBckIsQ0FBdkI7O0FBQ0EsVUFBSSxPQUFPZ0QsY0FBUCxLQUEwQixRQUE5QixFQUF3QztBQUN0Q3ZELFFBQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQmtELGNBQWpCLEdBQWtDLENBQUNBLGNBQWMsQ0FBQ0ssT0FBZixDQUF1QixDQUF2QixDQUFuQztBQUNELE9BRkQsTUFFTztBQUNMNUQsUUFBQUEsU0FBUyxDQUFDSyxNQUFWLENBQWlCa0QsY0FBakIsR0FBa0NBLGNBQWxDO0FBQ0Q7O0FBQ0R2RCxNQUFBQSxTQUFTLENBQUNLLE1BQVYsQ0FBaUJrRCxjQUFqQjtBQUNEO0FBQ0YsR0EzSmtFLENBNEpuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQXZELEVBQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQndELGFBQWpCLEdBQWlDLEtBQWpDO0FBQ0EsU0FBTztBQUFDN0QsSUFBQUEsU0FBUyxFQUFUQSxTQUFEO0FBQVk4RCxJQUFBQSxZQUFZLEVBQUU3RDtBQUExQixHQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAndXRpbHMvYWdncmVnYXRlLXV0aWxzJzsgLy8gbGlzdCBvZiBmdW5jdGlvbnNcbmltcG9ydCBnZW9WaWV3cG9ydCBmcm9tICdAbWFwYm94L2dlby12aWV3cG9ydCc7XG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcbmltcG9ydCB7Z2V0RmlsZVR5cGV9IGZyb20gJ3Byb2Nlc3NvcnMvZmlsZS1oYW5kbGVyJztcbmltcG9ydCBib29sZWFuRGlzam9pbnQgZnJvbSAnQHR1cmYvYm9vbGVhbi1kaXNqb2ludCc7XG5pbXBvcnQge3BvaW50LCBwb2x5Z29ufSBmcm9tICdAdHVyZi9oZWxwZXJzJztcbi8vIGltcG9ydCBzaW1wbGlmeSBmcm9tICdAdHVyZi9zaW1wbGlmeSc7XG5pbXBvcnQgc2ltcGxpZnkgZnJvbSAnc2ltcGxpZnktZ2VvanNvbic7XG4vLyBleHBvcnQgY29uc3QgV0lER0VUX1RZUEVTID0ga2V5TWlycm9yKHtcbi8vICAgZnVuY3Rpb246IG51bGxcbi8vIH0pO1xuXG4vLyBmdW5jdGlvbiByYW5nZShhLCBiKSB7XG4vLyAgIGlmIChhID4gYikge1xuLy8gICAgIHJldHVybiBbYiwgYV07XG4vLyAgIH1cbi8vICAgcmV0dXJuIFthLCBiXTtcbi8vIH1cblxuLy8gZnVuY3Rpb24gZmxhdFZhbFRvUG9pbnQoYXJyKSB7XG4vLyAgIGNvbnN0IGZsYXRJbmZpbml0eUFyckxlbmd0aCA9IGFyci5mbGF0KEluZmluaXR5KS5sZW5ndGg7XG4vLyAgIGNvbnN0IGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG4vLyAgIGlmIChhcnIuZmxhdCgpLmxlbmd0aCA9PT0gZmxhdEluZmluaXR5QXJyTGVuZ3RoKSB7XG4vLyAgICAgcmV0dXJuIGFycjtcbi8vICAgfSBlbHNlIHtcbi8vICAgICByZXR1cm4gZmxhdFZhbFRvUG9pbnQoYXJyLmZsYXQoKSk7XG4vLyAgIH1cbi8vIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YShuZXdXaWRnZXQsIHN0YXRlLCBtYXBTdGF0ZSkge1xuICBsZXQgbGF0UmFuZ2UsIGxuZ1JhbmdlO1xuXG4gIGNvbnN0IHtkYXRhSWQsIGFnZ3JlZ2F0aW9uVHlwZSwgYm91bmRzfSA9IG5ld1dpZGdldC5jb25maWc7XG4gIGxldCBib3VuZGluZ0JveDtcbiAgbGV0IGNVTCwgY1VSLCBjTEwsIGNMUjtcbiAgdmFyIHtkYXRhLCBsYWJlbH0gPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuXG4gIGlmICghbmV3V2lkZ2V0LmNvbmZpZy5zZWxlY3RlZExheWVyKSB7XG4gICAgcmV0dXJuIG5ld1dpZGdldDtcbiAgfVxuXG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgoXG4gICAgbCA9PiBsLmlkID09PSBuZXdXaWRnZXQuY29uZmlnLnNlbGVjdGVkTGF5ZXIuaWRcbiAgKTtcblxuICBjb25zdCB7ZmllbGRzfSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKG1hcFN0YXRlICYmIGJvdW5kcykge1xuICAgIGNvbnN0IHtsb25naXR1ZGUsIGxhdGl0dWRlLCBoZWlnaHQsIHdpZHRoLCB6b29tLCBwaXRjaCwgYmVhcmluZ30gPSBtYXBTdGF0ZTtcblxuICAgIGJvdW5kaW5nQm94ID0gZ2VvVmlld3BvcnQuYm91bmRzKFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgem9vbSwgW1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICBdKTtcblxuICAgIGNvbnN0IHZpZXdwb3J0ID0gbmV3IFdlYk1lcmNhdG9yVmlld3BvcnQoe1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgIHpvb206IHpvb20sXG4gICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgfSk7XG4gICAgY1VMID0gdmlld3BvcnQudW5wcm9qZWN0KFswLCAwXSk7XG4gICAgY1VSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgMF0pO1xuICAgIGNMUiA9IHZpZXdwb3J0LnVucHJvamVjdChbd2lkdGgsIGhlaWdodF0pO1xuICAgIGNMTCA9IHZpZXdwb3J0LnVucHJvamVjdChbMCwgaGVpZ2h0XSk7XG5cbiAgICBsYXRSYW5nZSA9IFsuLi5uZXcgU2V0KFtjTExbMV0sIGNVUlsxXSwgY0xSWzFdLCBjVUxbMV1dKV0uc29ydChcbiAgICAgIChhLCBiKSA9PiBhIC0gYlxuICAgICk7XG4gICAgbG5nUmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzBdLCBjVVJbMF0sIGNMUlswXSwgY1VMWzBdXSldLnNvcnQoXG4gICAgICAoYSwgYikgPT4gYSAtIGJcbiAgICApO1xuXG4gICAgY29uc3QgYm91bmRpbmdQb2x5Z29uID0ge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtbY1VMLCBjVVIsIGNMUiwgY0xMXV0sXG4gICAgICBjcnM6IHtcbiAgICAgICAgdHlwZTogJ25hbWUnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgbmFtZTogJ0VQU0c6NDMyNidcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoZ2V0RmlsZVR5cGUobGFiZWwpICE9PSAnanNvbicgJiYgYm91bmRpbmdCb3gpIHtcbiAgICAgIGNvbnN0IGxhdElkeCA9IHN0YXRlLmxheWVyc1tpZHhdLmNvbmZpZy5jb2x1bW5zLmxhdC5maWVsZElkeDtcbiAgICAgIGNvbnN0IGxuZ0lkeCA9IHN0YXRlLmxheWVyc1tpZHhdLmNvbmZpZy5jb2x1bW5zLmxuZy5maWVsZElkeDtcbiAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihkID0+XG4gICAgICAgIHBpdGNoIHx8IGJlYXJpbmdcbiAgICAgICAgICA/ICFib29sZWFuRGlzam9pbnQocG9pbnQoW2RbbG5nSWR4XSwgZFtsYXRJZHhdXSksIGJvdW5kaW5nUG9seWdvbilcbiAgICAgICAgICA6IGRbbGF0SWR4XSA+IGxhdFJhbmdlWzBdICYmXG4gICAgICAgICAgICBkW2xhdElkeF0gPCBsYXRSYW5nZVsxXSAmJlxuICAgICAgICAgICAgZFtsbmdJZHhdID4gbG5nUmFuZ2VbMF0gJiZcbiAgICAgICAgICAgIGRbbG5nSWR4XSA8IGxuZ1JhbmdlWzFdXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYm91bmRpbmdCb3gpIHtcbiAgICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTikge1xuICAgICAgICBzdGF0ZSA9IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBkYXRhc2V0czoge1xuICAgICAgICAgICAgLi4uc3RhdGUuZGF0YXNldHMsXG4gICAgICAgICAgICBbZGF0YUlkXToge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgICAgICAgICBzaW1wbGlmaWVkR2VvSlNPTjogZGF0YS5tYXAoZCA9PiBbXG4gICAgICAgICAgICAgICAgLi4uZCxcbiAgICAgICAgICAgICAgICAoZFswXSA9IHNpbXBsaWZ5KGRbMF0sIDAuMDEpKVxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy9jb21tZW50ZWQgcGFydCBpcyB1c2luZyB2aWV3cG9ydCB0byB0ZWxsIHdoaWNoIHBvaW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgZmFzdGVyIHRoYW4gdHVyZi5qc1xuXG4gICAgICAvLyBjb25zb2xlLmxvZygnc3RhdGUgaW5zaWRlIGdlb2pzb24gYWdncmVnYXRpb24gJywgc3RhdGUpO1xuICAgICAgLy8gZGF0YSA9IHN0YXRlLmQgYXRhc2V0c1tkYXRhSWRdLnNpbXBsaWZpZWRHZW9KU09OLmZpbHRlcihkID0+XG4gICAgICAvLyAgIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMucmVkdWNlKChhY2N1LCB2YWwpID0+IHtcbiAgICAgIC8vICAgICB2YXIgcG9pbnRJbnNpZGVCb3VuZHMgPSBmYWxzZTtcbiAgICAgIC8vICAgICBpZiAoYWNjdSkgcmV0dXJuIGFjY3U7XG4gICAgICAvLyAgICAgdmFyIGkgPSAwO1xuICAgICAgLy8gICAgIGNvbnN0IGZsYXRWYWwgPSBmbGF0VmFsVG9Qb2ludCh2YWwpO1xuICAgICAgLy8gICAgIC8vIGlmICh2YWxbaV0ubGVuZ3RoID4gMikge1xuICAgICAgLy8gICAgIC8vICAgZmxhdFZhbCA9IHZhbC5mbGF0KCk7XG4gICAgICAvLyAgICAgLy8gfVxuICAgICAgLy8gICAgIGRvIHtcbiAgICAgIC8vICAgICAgIGNvbnN0IHAgPSBmbGF0VmFsW2ldO1xuICAgICAgLy8gICAgICAgLy8gY29uc29sZS5sb2coJ3BvaW50IGluc2lkZSBkbyB3aGlsZSBsb29wJywgcCk7XG4gICAgICAvLyAgICAgICBpZiAoXG4gICAgICAvLyAgICAgICAgIHZpZXdwb3J0LnByb2plY3QoW3BbMF0sIHBbMV1dKVswXSA+IDAgJiZcbiAgICAgIC8vICAgICAgICAgdmlld3BvcnQucHJvamVjdChbcFswXSwgcFsxXV0pWzBdIDwgd2lkdGggJiZcbiAgICAgIC8vICAgICAgICAgdmlld3BvcnQucHJvamVjdChbcFswXSwgcFsxXV0pWzFdID4gMCAmJlxuICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMV0gPCBoZWlnaHRcbiAgICAgIC8vICAgICAgICkge1xuICAgICAgLy8gICAgICAgICBwb2ludEluc2lkZUJvdW5kcyA9IHRydWU7XG4gICAgICAvLyAgICAgICB9XG4gICAgICAvLyAgICAgICBpKys7XG4gICAgICAvLyAgICAgfSB3aGlsZSAoIXBvaW50SW5zaWRlQm91bmRzICYmIGkgPCB2YWwubGVuZ3RoKTtcbiAgICAgIC8vICAgICByZXR1cm4gcG9pbnRJbnNpZGVCb3VuZHM7XG4gICAgICAvLyAgIH0sIGZhbHNlKVxuICAgICAgLy8gKTtcbiAgICAgIGRhdGEgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLnNpbXBsaWZpZWRHZW9KU09OLmZpbHRlcihcbiAgICAgICAgZCA9PiAhYm9vbGVhbkRpc2pvaW50KGRbMF0sIGJvdW5kaW5nUG9seWdvbilcbiAgICAgICk7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICB2aWV3cG9ydC5wcm9qZWN0KFswLCAwXSlbMF0gPiAwICYmIHZpZXdwb3J0LnByb2plY3QoWzAsIDBdKVswXSA8IHdpZHRoXG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5sZW5ndGgpO1xuICAgICAgLy8gZGF0YSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04uZmlsdGVyKFxuICAgICAgLy8gICBkID0+ICFib29sZWFuRGlzam9pbnQoZCwgYm91bmRpbmdQb2x5Z29uKVxuICAgICAgLy8gKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEubGVuZ3RoKTtcblxuICAgICAgLy8gZGF0YSA9IGRhdGEubWFwKGQgPT4ge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhkWzBdKTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coKTtcbiAgICAgIC8vIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhZ2dyZWdhdGlvblR5cGUgPT09ICdjb3VudCcpIHtcbiAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gZGF0YS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZmllbGROYW1lID0gbmV3V2lkZ2V0LmNvbmZpZy5maWVsZE5hbWU7XG4gICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgIGlmIChmaWVsZE5hbWUpIHtcbiAgICAgIGxldCBmaWVsZERhdGEgPSBkYXRhLm1hcChkID0+IHtcbiAgICAgICAgaWYgKGQuZGF0YSkge1xuICAgICAgICAgIHJldHVybiBkLmRhdGFbZmllbGRJZHhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBkW2ZpZWxkSWR4XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBhZ2dyZWdhdGVkRGF0YSA9IGFnZ3JlZ2F0ZShmaWVsZERhdGEsIGFnZ3JlZ2F0aW9uVHlwZSk7XG4gICAgICBpZiAodHlwZW9mIGFnZ3JlZ2F0ZWREYXRhID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gK2FnZ3JlZ2F0ZWREYXRhLnRvRml4ZWQoMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gYWdncmVnYXRlZERhdGE7XG4gICAgICB9XG4gICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhO1xuICAgIH1cbiAgfVxuICAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICAnbmV3V2lkZ2V0IGFuZCBzdGF0ZSBpbnNpZGUgY2FsY3VsYXRlQWdncmVnYXRpb25EYXRhJyxcbiAgLy8gICBuZXdXaWRnZXQsXG4gIC8vICAgc3RhdGVcbiAgLy8gKTtcbiAgbmV3V2lkZ2V0LmNvbmZpZy5pc0NhbGN1bGF0aW5nID0gZmFsc2U7XG4gIHJldHVybiB7bmV3V2lkZ2V0LCB1cGRhdGVkU3RhdGU6IHN0YXRlfTtcbn1cbiJdfQ==