kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
192 lines (158 loc) • 21.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.hexagonToPolygonGeo = hexagonToPolygonGeo;
exports.getGeojsonDataMaps = getGeojsonDataMaps;
exports.parseGeometryFromString = parseGeometryFromString;
exports.getGeojsonBounds = getGeojsonBounds;
exports.featureToDeckGlGeoType = featureToDeckGlGeoType;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _deck = require("deck.gl");
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; }
function hexagonToPolygonGeo(_ref, properties, radius, mapState) {
var object = _ref.object;
var viewport = new _deck.WebMercatorViewport(mapState);
var screenCenter = viewport.projectFlat(object.centroid);
var _viewport$getDistance = viewport.getDistanceScales(),
pixelsPerMeter = _viewport$getDistance.pixelsPerMeter;
var pixRadius = radius * pixelsPerMeter[0];
var coordinates = [];
for (var i = 0; i < 6; i++) {
var vertex = hex_corner(screenCenter, pixRadius, i);
coordinates.push(viewport.unprojectFlat(vertex));
}
coordinates.push(coordinates[0]);
return {
geometry: {
type: 'Polygon',
coordinates: [[[77.420654296875, 13.07412756381517], [77.4041748046875, 13.012586029874111], [77.38632202148438, 12.938983710096016], [77.46322631835938, 12.906859517826117], [77.50579833984375, 12.837242952998404], [77.56759643554688, 12.791713999000201], [77.67471313476562, 12.843937692841445], [77.706298828125, 12.86134318154514], [77.73651123046875, 12.920245100143122], [77.75848388671875, 12.981809528732812], [77.7557373046875, 13.047372256948787], [77.61566162109375, 13.169085434871482], [77.53463745117188, 13.099542418228534], [77.420654296875, 13.07412756381517]]]
},
properties: {
fieldIdx: 1
}
}; // return {
// geometry: {
// coordinates,
// type: 'LineString'
// },
// properties
// };
}
function hex_corner(center, radius, i) {
var angle_deg = 60 * i + 30;
var angle_rad = Math.PI / 180 * angle_deg;
return [center[0] + radius * Math.cos(angle_rad), center[1] + radius * Math.sin(angle_rad)];
}
/**
* Parse raw data to geojson feature
* @param allData
* @param getFeature
* @returns {{}}
*/
function getGeojsonDataMaps(allData, getFeature) {
var acceptableTypes = ['Point', 'MultiPoint', 'LineString', 'MultiLineString', 'Polygon', 'MultiPolygon', 'GeometryCollection'];
var dataToFeature = {};
allData.forEach(function (d, index) {
dataToFeature[index] = null;
var rawFeature = getFeature(d);
var feature = null; // parse feature from field
if (Array.isArray(rawFeature)) {
// Support geojson as an array of points
feature = {
type: 'Feature',
geometry: {
// why do we need to flip it...
coordinates: rawFeature.map(function (pts) {
return [pts[1], pts[0]];
}),
type: 'LineString'
}
};
} else if (typeof rawFeature === 'string') {
feature = parseGeometryFromString(rawFeature);
} else if ((0, _typeof2["default"])(rawFeature) === 'object') {
// Support geojson feature as object
// probably need to normalize it as well
var normalized = normalize(rawFeature);
if (!normalized || !Array.isArray(normalized.features)) {
// fail to normalize geojson
return null;
}
feature = normalized.features[0];
}
if (feature && feature.geometry && acceptableTypes.includes(feature.geometry.type)) {
// store index of the data in feature properties
feature.properties = _objectSpread({}, feature.properties || {}, {
index: index
});
dataToFeature[index] = feature;
}
});
return dataToFeature;
}
/**
* Parse geojson from string
* @param {String} geoString
* @returns {null | Object} geojson object or null if failed
*/
function parseGeometryFromString(geoString) {
var parsedGeo; // try parse as geojson string
// {"type":"Polygon","coordinates":[[[-74.158491,40.83594]]]}
try {
parsedGeo = JSON.parse(geoString);
} catch (e) {} // keep trying to parse
// try parse as wkt
if (!parsedGeo) {
try {
parsedGeo = wktParser(geoString);
} catch (e) {
return null;
}
}
if (!parsedGeo) {
return null;
}
var normalized = normalize(parsedGeo);
if (!normalized || !Array.isArray(normalized.features)) {
// fail to normalize geojson
return null;
}
return normalized.features[0];
}
function getGeojsonBounds() {
var features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
// calculate feature bounds is computation heavy
// here we only pick couple
var samples = features.length > 500 ? getSampleData(features, 500) : features;
var nonEmpty = samples.filter(function (d) {
return d && d.geometry && d.geometry.coordinates && d.geometry.coordinates.length;
});
try {
return geojsonExtent({
type: 'FeatureCollection',
features: nonEmpty
});
} catch (e) {
return null;
}
}
function featureToDeckGlGeoType(type) {
switch (type) {
case 'Point':
case 'MultiPoint':
return 'point';
case 'LineString':
case 'MultiLineString':
return 'line';
case 'Polygon':
case 'MultiPolygon':
return 'polygon';
default:
return null;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYm91bmRhcnktbGF5ZXIvYm91bmRhcnktdXRpbHMuanMiXSwibmFtZXMiOlsiaGV4YWdvblRvUG9seWdvbkdlbyIsInByb3BlcnRpZXMiLCJyYWRpdXMiLCJtYXBTdGF0ZSIsIm9iamVjdCIsInZpZXdwb3J0IiwiV2ViTWVyY2F0b3JWaWV3cG9ydCIsInNjcmVlbkNlbnRlciIsInByb2plY3RGbGF0IiwiY2VudHJvaWQiLCJnZXREaXN0YW5jZVNjYWxlcyIsInBpeGVsc1Blck1ldGVyIiwicGl4UmFkaXVzIiwiY29vcmRpbmF0ZXMiLCJpIiwidmVydGV4IiwiaGV4X2Nvcm5lciIsInB1c2giLCJ1bnByb2plY3RGbGF0IiwiZ2VvbWV0cnkiLCJ0eXBlIiwiZmllbGRJZHgiLCJjZW50ZXIiLCJhbmdsZV9kZWciLCJhbmdsZV9yYWQiLCJNYXRoIiwiUEkiLCJjb3MiLCJzaW4iLCJnZXRHZW9qc29uRGF0YU1hcHMiLCJhbGxEYXRhIiwiZ2V0RmVhdHVyZSIsImFjY2VwdGFibGVUeXBlcyIsImRhdGFUb0ZlYXR1cmUiLCJmb3JFYWNoIiwiZCIsImluZGV4IiwicmF3RmVhdHVyZSIsImZlYXR1cmUiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJwdHMiLCJwYXJzZUdlb21ldHJ5RnJvbVN0cmluZyIsIm5vcm1hbGl6ZWQiLCJub3JtYWxpemUiLCJmZWF0dXJlcyIsImluY2x1ZGVzIiwiZ2VvU3RyaW5nIiwicGFyc2VkR2VvIiwiSlNPTiIsInBhcnNlIiwiZSIsIndrdFBhcnNlciIsImdldEdlb2pzb25Cb3VuZHMiLCJzYW1wbGVzIiwibGVuZ3RoIiwiZ2V0U2FtcGxlRGF0YSIsIm5vbkVtcHR5IiwiZmlsdGVyIiwiZ2VvanNvbkV4dGVudCIsImZlYXR1cmVUb0RlY2tHbEdlb1R5cGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOzs7Ozs7QUFFTyxTQUFTQSxtQkFBVCxPQUF1Q0MsVUFBdkMsRUFBbURDLE1B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QUFFTSxTQUFTUSxnQkFBVCxHQUF5QztBQUFBLE1BQWZSLFFBQWUsdUVBQUosRUFBSTtBQUM5QztBQUNBO0FBQ0EsTUFBTVMsT0FBTyxHQUNYVCxRQUFRLENBQUNVLE1BQVQsR0FBa0IsR0FBbEIsR0FBd0JDLGFBQWEsQ0FBQ1gsUUFBRCxFQUFXLEdBQVgsQ0FBckMsR0FBdURBLFFBRHpEO0FBR0EsTUFBTVksUUFBUSxHQUFHSCxPQUFPLENBQUNJLE1BQVIsQ0FDZixVQUFBeEIsQ0FBQztBQUFBLFdBQ0NBLENBQUMsSUFBSUEsQ0FBQyxDQUFDaEIsUUFBUCxJQUFtQmdCLENBQUMsQ0FBQ2hCLFFBQUYsQ0FBV04sV0FBOUIsSUFBNkNzQixDQUFDLENBQUNoQixRQUFGLENBQVdOLFdBQVgsQ0FBdUIyQyxNQURyRTtBQUFBLEdBRGMsQ0FBakI7O0FBS0EsTUFBSTtBQUNGLFdBQU9JLGFBQWEsQ0FBQztBQUNuQnhDLE1BQUFBLElBQUksRUFBRSxtQkFEYTtBQUVuQjBCLE1BQUFBLFFBQVEsRUFBRVk7QUFGUyxLQUFELENBQXBCO0FBSUQsR0FMRCxDQUtFLE9BQU9OLENBQVAsRUFBVTtBQUNWLFdBQU8sSUFBUDtBQUNEO0FBQ0Y7O0FBRU0sU0FBU1Msc0JBQVQsQ0FBZ0N6QyxJQUFoQyxFQUFzQztBQUMzQyxVQUFRQSxJQUFSO0FBQ0UsU0FBSyxPQUFMO0FBQ0EsU0FBSyxZQUFMO0FBQ0UsYUFBTyxPQUFQOztBQUVGLFNBQUssWUFBTDtBQUNBLFNBQUssaUJBQUw7QUFDRSxhQUFPLE1BQVA7O0FBRUYsU0FBSyxTQUFMO0FBQ0EsU0FBSyxjQUFMO0FBQ0UsYUFBTyxTQUFQOztBQUVGO0FBQ0UsYUFBTyxJQUFQO0FBZEo7QUFnQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1dlYk1lcmNhdG9yVmlld3BvcnR9IGZyb20gJ2RlY2suZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGV4YWdvblRvUG9seWdvbkdlbyh7b2JqZWN0fSwgcHJvcGVydGllcywgcmFkaXVzLCBtYXBTdGF0ZSkge1xuICBjb25zdCB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KG1hcFN0YXRlKTtcblxuICBjb25zdCBzY3JlZW5DZW50ZXIgPSB2aWV3cG9ydC5wcm9qZWN0RmxhdChvYmplY3QuY2VudHJvaWQpO1xuICBjb25zdCB7cGl4ZWxzUGVyTWV0ZXJ9ID0gdmlld3BvcnQuZ2V0RGlzdGFuY2VTY2FsZXMoKTtcbiAgY29uc3QgcGl4UmFkaXVzID0gcmFkaXVzICogcGl4ZWxzUGVyTWV0ZXJbMF07XG5cbiAgY29uc3QgY29vcmRpbmF0ZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgIGNvbnN0IHZlcnRleCA9IGhleF9jb3JuZXIoc2NyZWVuQ2VudGVyLCBwaXhSYWRpdXMsIGkpO1xuICAgIGNvb3JkaW5hdGVzLnB1c2godmlld3BvcnQudW5wcm9qZWN0RmxhdCh2ZXJ0ZXgpKTtcbiAgfVxuXG4gIGNvb3JkaW5hdGVzLnB1c2goY29vcmRpbmF0ZXNbMF0pO1xuICByZXR1cm4ge1xuICAgIGdlb21ldHJ5OiB7XG4gICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICBjb29yZGluYXRlczogW1xuICAgICAgICBbXG4gICAgICAgICAgWzc3LjQyMDY1NDI5Njg3NSwgMTMuMDc0MTI3NTYzODE1MTddLFxuICAgICAgICAgIFs3Ny40MDQxNzQ4MDQ2ODc1LCAxMy4wMTI1ODYwMjk4NzQxMTFdLFxuICAgICAgICAgIFs3Ny4zODYzMjIwMjE0ODQzOCwgMTIuOTM4OTgzNzEwMDk2MDE2XSxcbiAgICAgICAgICBbNzcuNDYzMjI2MzE4MzU5MzgsIDEyLjkwNjg1OTUxNzgyNjExN10sXG4gICAgICAgICAgWzc3LjUwNTc5ODMzOTg0Mzc1LCAxMi44MzcyNDI5NTI5OTg0MDRdLFxuICAgICAgICAgIFs3Ny41Njc1OTY0MzU1NDY4OCwgMTIuNzkxNzEzOTk5MDAwMjAxXSxcbiAgICAgICAgICBbNzcuNjc0NzEzMTM0NzY1NjIsIDEyLjg0MzkzNzY5Mjg0MTQ0NV0sXG4gICAgICAgICAgWzc3LjcwNjI5ODgyODEyNSwgMTIuODYxMzQzMTgxNTQ1MTRdLFxuICAgICAgICAgIFs3Ny43MzY1MTEyMzA0Njg3NSwgMTIuOTIwMjQ1MTAwMTQzMTIyXSxcbiAgICAgICAgICBbNzcuNzU4NDgzODg2NzE4NzUsIDEyLjk4MTgwOTUyODczMjgxMl0sXG4gICAgICAgICAgWzc3Ljc1NTczNzMwNDY4NzUsIDEzLjA0NzM3MjI1Njk0ODc4N10sXG4gICAgICAgICAgWzc3LjYxNTY2MTYyMTA5Mzc1LCAxMy4xNjkwODU0MzQ4NzE0ODJdLFxuICAgICAgICAgIFs3Ny41MzQ2Mzc0NTExNzE4OCwgMTMuMDk5NTQyNDE4MjI4NTM0XSxcbiAgICAgICAgICBbNzcuNDIwNjU0Mjk2ODc1LCAxMy4wNzQxMjc1NjM4MTUxN11cbiAgICAgICAgXVxuICAgICAgXVxuICAgIH0sXG4gICAgcHJvcGVydGllczoge1xuICAgICAgZmllbGRJZHg6IDFcbiAgICB9XG4gIH07XG4gIC8vIHJldHVybiB7XG4gIC8vICAgZ2VvbWV0cnk6IHtcbiAgLy8gICAgIGNvb3JkaW5hdGVzLFxuICAvLyAgICAgdHlwZTogJ0xpbmVTdHJpbmcnXG4gIC8vICAgfSxcbiAgLy8gICBwcm9wZXJ0aWVzXG4gIC8vIH07XG59XG5cbmZ1bmN0aW9uIGhleF9jb3JuZXIoY2VudGVyLCByYWRpdXMsIGkpIHtcbiAgY29uc3QgYW5nbGVfZGVnID0gNjAgKiBpICsgMzA7XG4gIGNvbnN0IGFuZ2xlX3JhZCA9IChNYXRoLlBJIC8gMTgwKSAqIGFuZ2xlX2RlZztcblxuICByZXR1cm4gW1xuICAgIGNlbnRlclswXSArIHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlX3JhZCksXG4gICAgY2VudGVyWzFdICsgcmFkaXVzICogTWF0aC5zaW4oYW5nbGVfcmFkKVxuICBdO1xufVxuXG4vKipcbiAqIFBhcnNlIHJhdyBkYXRhIHRvIGdlb2pzb24gZmVhdHVyZVxuICogQHBhcmFtIGFsbERhdGFcbiAqIEBwYXJhbSBnZXRGZWF0dXJlXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW9qc29uRGF0YU1hcHMoYWxsRGF0YSwgZ2V0RmVhdHVyZSkge1xuICBjb25zdCBhY2NlcHRhYmxlVHlwZXMgPSBbXG4gICAgJ1BvaW50JyxcbiAgICAnTXVsdGlQb2ludCcsXG4gICAgJ0xpbmVTdHJpbmcnLFxuICAgICdNdWx0aUxpbmVTdHJpbmcnLFxuICAgICdQb2x5Z29uJyxcbiAgICAnTXVsdGlQb2x5Z29uJyxcbiAgICAnR2VvbWV0cnlDb2xsZWN0aW9uJ1xuICBdO1xuXG4gIGNvbnN0IGRhdGFUb0ZlYXR1cmUgPSB7fTtcblxuICBhbGxEYXRhLmZvckVhY2goKGQsIGluZGV4KSA9PiB7XG4gICAgZGF0YVRvRmVhdHVyZVtpbmRleF0gPSBudWxsO1xuICAgIGNvbnN0IHJhd0ZlYXR1cmUgPSBnZXRGZWF0dXJlKGQpO1xuXG4gICAgbGV0IGZlYXR1cmUgPSBudWxsO1xuXG4gICAgLy8gcGFyc2UgZmVhdHVyZSBmcm9tIGZpZWxkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3RmVhdHVyZSkpIHtcbiAgICAgIC8vIFN1cHBvcnQgZ2VvanNvbiBhcyBhbiBhcnJheSBvZiBwb2ludHNcbiAgICAgIGZlYXR1cmUgPSB7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAvLyB3aHkgZG8gd2UgbmVlZCB0byBmbGlwIGl0Li4uXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IHJhd0ZlYXR1cmUubWFwKHB0cyA9PiBbcHRzWzFdLCBwdHNbMF1dKSxcbiAgICAgICAgICB0eXBlOiAnTGluZVN0cmluZydcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdGZWF0dXJlID09PSAnc3RyaW5nJykge1xuICAgICAgZmVhdHVyZSA9IHBhcnNlR2VvbWV0cnlGcm9tU3RyaW5nKHJhd0ZlYXR1cmUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhd0ZlYXR1cmUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBTdXBwb3J0IGdlb2pzb24gZmVhdHVyZSBhcyBvYmplY3RcbiAgICAgIC8vIHByb2JhYmx5IG5lZWQgdG8gbm9ybWFsaXplIGl0IGFzIHdlbGxcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemUocmF3RmVhdHVyZSk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQgfHwgIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZC5mZWF0dXJlcykpIHtcbiAgICAgICAgLy8gZmFpbCB0byBub3JtYWxpemUgZ2VvanNvblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZmVhdHVyZSA9IG5vcm1hbGl6ZWQuZmVhdHVyZXNbMF07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZmVhdHVyZSAmJlxuICAgICAgZmVhdHVyZS5nZW9tZXRyeSAmJlxuICAgICAgYWNjZXB0YWJsZVR5cGVzLmluY2x1ZGVzKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSlcbiAgICApIHtcbiAgICAgIC8vIHN0b3JlIGluZGV4IG9mIHRoZSBkYXRhIGluIGZlYXR1cmUgcHJvcGVydGllc1xuICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzID0ge1xuICAgICAgICAuLi4oZmVhdHVyZS5wcm9wZXJ0aWVzIHx8IHt9KSxcbiAgICAgICAgaW5kZXhcbiAgICAgIH07XG5cbiAgICAgIGRhdGFUb0ZlYXR1cmVbaW5kZXhdID0gZmVhdHVyZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhVG9GZWF0dXJlO1xufVxuXG4vKipcbiAqIFBhcnNlIGdlb2pzb24gZnJvbSBzdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBnZW9TdHJpbmdcbiAqIEByZXR1cm5zIHtudWxsIHwgT2JqZWN0fSBnZW9qc29uIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHZW9tZXRyeUZyb21TdHJpbmcoZ2VvU3RyaW5nKSB7XG4gIGxldCBwYXJzZWRHZW87XG5cbiAgLy8gdHJ5IHBhcnNlIGFzIGdlb2pzb24gc3RyaW5nXG4gIC8vIHtcInR5cGVcIjpcIlBvbHlnb25cIixcImNvb3JkaW5hdGVzXCI6W1tbLTc0LjE1ODQ5MSw0MC44MzU5NF1dXX1cbiAgdHJ5IHtcbiAgICBwYXJzZWRHZW8gPSBKU09OLnBhcnNlKGdlb1N0cmluZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBrZWVwIHRyeWluZyB0byBwYXJzZVxuICB9XG5cbiAgLy8gdHJ5IHBhcnNlIGFzIHdrdFxuICBpZiAoIXBhcnNlZEdlbykge1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWRHZW8gPSB3a3RQYXJzZXIoZ2VvU3RyaW5nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpZiAoIXBhcnNlZEdlbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZShwYXJzZWRHZW8pO1xuXG4gIGlmICghbm9ybWFsaXplZCB8fCAhQXJyYXkuaXNBcnJheShub3JtYWxpemVkLmZlYXR1cmVzKSkge1xuICAgIC8vIGZhaWwgdG8gbm9ybWFsaXplIGdlb2pzb25cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkLmZlYXR1cmVzWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvanNvbkJvdW5kcyhmZWF0dXJlcyA9IFtdKSB7XG4gIC8vIGNhbGN1bGF0ZSBmZWF0dXJlIGJvdW5kcyBpcyBjb21wdXRhdGlvbiBoZWF2eVxuICAvLyBoZXJlIHdlIG9ubHkgcGljayBjb3VwbGVcbiAgY29uc3Qgc2FtcGxlcyA9XG4gICAgZmVhdHVyZXMubGVuZ3RoID4gNTAwID8gZ2V0U2FtcGxlRGF0YShmZWF0dXJlcywgNTAwKSA6IGZlYXR1cmVzO1xuXG4gIGNvbnN0IG5vbkVtcHR5ID0gc2FtcGxlcy5maWx0ZXIoXG4gICAgZCA9PlxuICAgICAgZCAmJiBkLmdlb21ldHJ5ICYmIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgJiYgZC5nZW9tZXRyeS5jb29yZGluYXRlcy5sZW5ndGhcbiAgKTtcblxuICB0cnkge1xuICAgIHJldHVybiBnZW9qc29uRXh0ZW50KHtcbiAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICBmZWF0dXJlczogbm9uRW1wdHlcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlVG9EZWNrR2xHZW9UeXBlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnUG9pbnQnOlxuICAgIGNhc2UgJ011bHRpUG9pbnQnOlxuICAgICAgcmV0dXJuICdwb2ludCc7XG5cbiAgICBjYXNlICdMaW5lU3RyaW5nJzpcbiAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOlxuICAgICAgcmV0dXJuICdsaW5lJztcblxuICAgIGNhc2UgJ1BvbHlnb24nOlxuICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICByZXR1cm4gJ3BvbHlnb24nO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=