kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
215 lines (174 loc) • 21.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.decodeTile = decodeTile;
exports.getTileData = getTileData;
exports.vectorTileFeatureToProp = vectorTileFeatureToProp;
var _pbf = _interopRequireDefault(require("pbf"));
var _vectorTile = require("@mapbox/vector-tile");
var _viewportMercatorProject = require("viewport-mercator-project");
// Copyright (c) 2023 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
/* global fetch */
var TILE_SIZE = 512;
var MAPBOX_HOST = 'https://a.tiles.mapbox.com';
var MAP_SOURCE = '/v4/mapbox.mapbox-streets-v7';
function getTileData(host, token, _ref) {
var x = _ref.x,
y = _ref.y,
z = _ref.z;
var mapSource = "".concat(host || MAPBOX_HOST).concat(MAP_SOURCE, "/").concat(z, "/").concat(x, "/").concat(y, ".vector.pbf?access_token=").concat(token);
return fetch(mapSource).then(function (response) {
return response.arrayBuffer();
}).then(function (buffer) {
return decodeTile(x, y, z, buffer);
});
}
function decodeTile(x, y, z, arrayBuffer) {
var tile = new _vectorTile.VectorTile(new _pbf["default"](arrayBuffer));
var result = [];
var xProj = x * TILE_SIZE;
var yProj = y * TILE_SIZE;
var scale = Math.pow(2, z);
var projectFunc = project.bind(null, xProj, yProj, scale);
/* eslint-disable guard-for-in */
var layerName = 'building';
var vectorTileLayer = tile.layers[layerName];
if (!vectorTileLayer) {
return [];
}
for (var i = 0; i < vectorTileLayer.length; i++) {
var vectorTileFeature = vectorTileLayer.feature(i);
var features = vectorTileFeatureToProp(vectorTileFeature, projectFunc);
features.forEach(function (f) {
f.properties.layer = layerName;
if (f.properties.height) {
result.push(f);
}
});
}
return result;
}
function project(x, y, scale, line, extent) {
var sizeToPixel = extent / TILE_SIZE;
for (var ii = 0; ii < line.length; ii++) {
var p = line[ii]; // LNGLAT
line[ii] = (0, _viewportMercatorProject.worldToLngLat)([x + p[0] / sizeToPixel, y + p[1] / sizeToPixel], scale);
}
}
/* adapted from @mapbox/vector-tile/lib/vectortilefeature.js for better perf */
/* eslint-disable */
function vectorTileFeatureToProp(vectorTileFeature, project) {
var coords = getCoordinates(vectorTileFeature);
var type = _vectorTile.VectorTileFeature.types[vectorTileFeature.type];
var extent = vectorTileFeature.extent;
var i;
var j;
coords = classifyRings(coords);
for (i = 0; i < coords.length; i++) {
for (j = 0; j < coords[i].length; j++) {
project(coords[i][j], extent);
}
}
return coords.map(function (coordinates) {
return {
coordinates: coordinates,
properties: vectorTileFeature.properties
};
});
}
function getCoordinates(vectorTileFeature) {
var pbf = vectorTileFeature._pbf;
pbf.pos = vectorTileFeature._geometry;
var end = pbf.readVarint() + pbf.pos;
var cmd = 1;
var length = 0;
var x = 0;
var y = 0;
var lines = [];
var line;
while (pbf.pos < end) {
if (length <= 0) {
var cmdLen = pbf.readVarint();
cmd = cmdLen & 0x7;
length = cmdLen >> 3;
}
length--;
if (cmd === 1 || cmd === 2) {
x += pbf.readSVarint();
y += pbf.readSVarint();
if (cmd === 1) {
// moveTo
if (line) lines.push(line);
line = [];
}
line.push([x, y]);
} else if (cmd === 7) {
// Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
if (line) {
line.push(line[0].slice()); // closePolygon
}
} else {
throw new Error("unknown command ".concat(cmd));
}
}
if (line) lines.push(line);
return lines;
} // classifies an array of rings into polygons with outer rings and holes
function classifyRings(rings) {
var len = rings.length;
if (len <= 1) return [rings];
var polygons = [];
var polygon;
var ccw;
for (var i = 0; i < len; i++) {
var area = signedArea(rings[i]);
if (area === 0) {
continue;
}
if (ccw === undefined) {
ccw = area < 0;
}
if (ccw === area < 0) {
if (polygon) {
polygons.push(polygon);
}
polygon = [rings[i]];
} else {
polygon.push(rings[i]);
}
}
if (polygon) {
polygons.push(polygon);
}
return polygons;
}
function signedArea(ring) {
var sum = 0;
for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
p1 = ring[i];
p2 = ring[j];
sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);
}
return sum;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzLzNkLWJ1aWxkaW5nLWxheWVyLzNkLWJ1aWxkaW5nLXV0aWxzLmpzIl0sIm5hbWVzIjpbIlRJTEVfU0laRSIsIk1BUEJPWF9IT1NUIiwiTUFQX1NPVVJDRSIsImdldFRpbGVEYXRhIiwiaG9zdCIsInRva2VuIiwieCIsInkiLCJ6IiwibWFwU291cmNlIiwiZmV0Y2giLCJ0aGVuIiwicmVzcG9uc2UiLCJhcnJheUJ1ZmZlciIsImJ1ZmZlciIsImRlY29kZVRpbGUiLCJ0aWxlIiwiVmVjdG9yVGlsZSIsIlByb3RvYnVmIiwicmVzdWx0IiwieFByb2oiLCJ5UHJvaiIsInNjYWxlIiwiTWF0aCIsInBvdyIsInByb2plY3RGdW5jIiwicHJvamVjdCIsImJpbmQiLCJsYXllck5hbWUiLCJ2ZWN0b3JUaWxlTGF5ZXIiLCJsYXllcnMiLCJpIiwibGVuZ3RoIiwidmVjdG9yVGlsZUZlYXR1cmUiLCJmZWF0dXJlIiwiZmVhdHVyZXMiLCJ2ZWN0b3JUaWxlRmVhdHVyZVRvUHJvcCIsImZvckVhY2giLCJmIiwicHJvcGVydGllcyIsImxheWVyIiwiaGVpZ2h0IiwicHVzaCIsImxpbmUiLCJleHRlbnQiLCJzaXplVG9QaXhlbCIsImlpIiwicCIsImNvb3JkcyIsImdldENvb3JkaW5hdGVzIiwidHlwZSIsIlZlY3RvclRpbGVGZWF0dXJlIiwidHlwZXMiLCJqIiwiY2xhc3NpZnlSaW5ncyIsIm1hcCIsImNvb3JkaW5hdGVzIiwicGJmIiwiX3BiZiIsInBvcyIsIl9nZW9tZXRyeSIsImVuZCIsInJlYWRWYXJpbnQiLCJjbWQiLCJsaW5lcyIsImNtZExlbiIsInJlYWRTVmFyaW50Iiwic2xpY2UiLCJFcnJvciIsInJpbmdzIiwibGVuIiwicG9seWdvbnMiLCJwb2x5Z29uIiwiY2N3IiwiYXJlYSIsInNpZ25lZEFyZWEiLCJ1bmRlZmluZWQiLCJyaW5nIiwic3VtIiwicDEiLCJwMiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFv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KGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmltcG9ydCB7VmVjdG9yVGlsZSwgVmVjdG9yVGlsZUZlYXR1cmV9IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuaW1wb3J0IHt3b3JsZFRvTG5nTGF0fSBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcblxuLyogZ2xvYmFsIGZldGNoICovXG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7XG5jb25zdCBNQVBCT1hfSE9TVCA9ICdodHRwczovL2EudGlsZXMubWFwYm94LmNvbSc7XG5jb25zdCBNQVBfU09VUkNFID0gJy92NC9tYXBib3gubWFwYm94LXN0cmVldHMtdjcnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGlsZURhdGEoaG9zdCwgdG9rZW4sIHt4LCB5LCB6fSkge1xuICBjb25zdCBtYXBTb3VyY2UgPSBgJHtob3N0IHx8XG4gICAgTUFQQk9YX0hPU1R9JHtNQVBfU09VUkNFfS8ke3p9LyR7eH0vJHt5fS52ZWN0b3IucGJmP2FjY2Vzc190b2tlbj0ke3Rva2VufWA7XG5cbiAgcmV0dXJuIGZldGNoKG1hcFNvdXJjZSlcbiAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKVxuICAgIC50aGVuKGJ1ZmZlciA9PiBkZWNvZGVUaWxlKHgsIHksIHosIGJ1ZmZlcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVGlsZSh4LCB5LCB6LCBhcnJheUJ1ZmZlcikge1xuICBjb25zdCB0aWxlID0gbmV3IFZlY3RvclRpbGUobmV3IFByb3RvYnVmKGFycmF5QnVmZmVyKSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IHhQcm9qID0geCAqIFRJTEVfU0laRTtcbiAgY29uc3QgeVByb2ogPSB5ICogVElMRV9TSVpFO1xuICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHopO1xuXG4gIGNvbnN0IHByb2plY3RGdW5jID0gcHJvamVjdC5iaW5kKG51bGwsIHhQcm9qLCB5UHJvaiwgc2NhbGUpO1xuXG4gIC8qIGVzbGludC1kaXNhYmxlIGd1YXJkLWZvci1pbiAqL1xuICBjb25zdCBsYXllck5hbWUgPSAnYnVpbGRpbmcnO1xuICBjb25zdCB2ZWN0b3JUaWxlTGF5ZXIgPSB0aWxlLmxheWVyc1tsYXllck5hbWVdO1xuICBpZiAoIXZlY3RvclRpbGVMYXllcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZlY3RvclRpbGVMYXllci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZlY3RvclRpbGVGZWF0dXJlID0gdmVjdG9yVGlsZUxheWVyLmZlYXR1cmUoaSk7XG4gICAgY29uc3QgZmVhdHVyZXMgPSB2ZWN0b3JUaWxlRmVhdHVyZVRvUHJvcCh2ZWN0b3JUaWxlRmVhdHVyZSwgcHJvamVjdEZ1bmMpO1xuICAgIGZlYXR1cmVzLmZvckVhY2goZiA9PiB7XG4gICAgICBmLnByb3BlcnRpZXMubGF5ZXIgPSBsYXllck5hbWU7XG4gICAgICBpZiAoZi5wcm9wZXJ0aWVzLmhlaWdodCkge1xuICAgICAgICByZXN1bHQucHVzaChmKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0KHgsIHksIHNjYWxlLCBsaW5lLCBleHRlbnQpIHtcbiAgY29uc3Qgc2l6ZVRvUGl4ZWwgPSBleHRlbnQgLyBUSUxFX1NJWkU7XG5cbiAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGxpbmUubGVuZ3RoOyBpaSsrKSB7XG4gICAgY29uc3QgcCA9IGxpbmVbaWldO1xuICAgIC8vIExOR0xBVFxuICAgIGxpbmVbaWldID0gd29ybGRUb0xuZ0xhdChcbiAgICAgIFt4ICsgcFswXSAvIHNpemVUb1BpeGVsLCB5ICsgcFsxXSAvIHNpemVUb1BpeGVsXSxcbiAgICAgIHNjYWxlXG4gICAgKTtcbiAgfVxufVxuXG4vKiBhZGFwdGVkIGZyb20gQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMgZm9yIGJldHRlciBwZXJmICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvclRpbGVGZWF0dXJlVG9Qcm9wKHZlY3RvclRpbGVGZWF0dXJlLCBwcm9qZWN0KSB7XG4gIGxldCBjb29yZHMgPSBnZXRDb29yZGluYXRlcyh2ZWN0b3JUaWxlRmVhdHVyZSk7XG4gIGNvbnN0IHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t2ZWN0b3JUaWxlRmVhdHVyZS50eXBlXTtcbiAgY29uc3QgZXh0ZW50ID0gdmVjdG9yVGlsZUZlYXR1cmUuZXh0ZW50O1xuICBsZXQgaTtcbiAgbGV0IGo7XG5cbiAgY29vcmRzID0gY2xhc3NpZnlSaW5ncyhjb29yZHMpO1xuICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgcHJvamVjdChjb29yZHNbaV1bal0sIGV4dGVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvb3Jkcy5tYXAoY29vcmRpbmF0ZXMgPT4gKHtcbiAgICBjb29yZGluYXRlcyxcbiAgICBwcm9wZXJ0aWVzOiB2ZWN0b3JUaWxlRmVhdHVyZS5wcm9wZXJ0aWVzXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29vcmRpbmF0ZXModmVjdG9yVGlsZUZlYXR1cmUpIHtcbiAgY29uc3QgcGJmID0gdmVjdG9yVGlsZUZlYXR1cmUuX3BiZjtcbiAgcGJmLnBvcyA9IHZlY3RvclRpbGVGZWF0dXJlLl9nZW9tZXRyeTtcblxuICBjb25zdCBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcbiAgbGV0IGNtZCA9IDE7XG4gIGxldCBsZW5ndGggPSAwO1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcblxuICBjb25zdCBsaW5lcyA9IFtdO1xuICBsZXQgbGluZTtcblxuICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgIGlmIChsZW5ndGggPD0gMCkge1xuICAgICAgY29uc3QgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgIH1cblxuICAgIGxlbmd0aC0tO1xuXG4gICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICBpZiAoY21kID09PSAxKSB7XG4gICAgICAgIC8vIG1vdmVUb1xuICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgbGluZSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBsaW5lLnB1c2goW3gsIHldKTtcbiAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBuaWstdmVjdG9yLXRpbGUvaXNzdWVzLzkwXG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsaW5lLnB1c2gobGluZVswXS5zbGljZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBjb21tYW5kICR7Y21kfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gIHJldHVybiBsaW5lcztcbn1cblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5cbmZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3MpIHtcbiAgY29uc3QgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgY29uc3QgcG9seWdvbnMgPSBbXTtcbiAgbGV0IHBvbHlnb247XG4gIGxldCBjY3c7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGFyZWEgPSBzaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICBpZiAoYXJlYSA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjY3cgPSBhcmVhIDwgMDtcbiAgICB9XG5cbiAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgaWYgKHBvbHlnb24pIHtcbiAgICAgICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICAgIH1cbiAgICAgIHBvbHlnb24gPSBbcmluZ3NbaV1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2x5Z29uLnB1c2gocmluZ3NbaV0pO1xuICAgIH1cbiAgfVxuICBpZiAocG9seWdvbikge1xuICAgIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gIH1cblxuICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEocmluZykge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgcDEgPSByaW5nW2ldO1xuICAgIHAyID0gcmluZ1tqXTtcbiAgICBzdW0gKz0gKHAyWzBdIC0gcDFbMF0pICogKHAxWzFdICsgcDJbMV0pO1xuICB9XG4gIHJldHVybiBzdW07XG59XG4iXX0=