kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
180 lines (175 loc) • 24.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateMapboxLayers = generateMapboxLayers;
exports.geoJsonFromData = geoJsonFromData;
exports.gpuFilterToMapboxFilter = gpuFilterToMapboxFilter;
exports.prefixGpuField = void 0;
exports.updateMapboxLayers = updateMapboxLayers;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _baseLayer = require("./base-layer");
var _utils = require("@kepler.gl/utils");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* This function will convert layers to mapbox layers
* @param layers the layers to be converted
* @param layerData extra layer information
* @param layerOrder the order by which we should convert layers
* @param layersToRender {[id]: true | false} object whether each layer should be rendered
* @returns
*/
function generateMapboxLayers() {
var layers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var layerData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var layerOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var layersToRender = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (layerData.length > 0) {
return layerOrder.slice().reverse().filter(function (layerId) {
var layer = (0, _utils.findById)(layerId)(layers);
return (layer === null || layer === void 0 ? void 0 : layer.overlayType) === _baseLayer.OVERLAY_TYPE_CONST.mapboxgl && layersToRender[layerId];
}).reduce(function (acc, layerId) {
var layerIndex = layers.findIndex(function (l) {
return l.id === layerId;
});
if (layerIndex === -1) {
return acc;
}
var layer = layers[layerIndex];
if (!(layer.overlayType === _baseLayer.OVERLAY_TYPE_CONST.mapboxgl && layersToRender[layerId])) {
return acc;
}
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, layer.id, {
id: layer.id,
data: layerData[layerIndex].data,
isVisible: layer.config.isVisible,
config: layerData[layerIndex].config,
hidden: layer.config.hidden,
sourceId: layerData[layerIndex].config.source
}));
}, {});
}
return {};
}
/**
* Update mapbox layers on the given map
* @param map
* @param newLayers Map of new mapbox layers to be displayed
* @param oldLayers Map of the old layers to be compare with the current ones to detect deleted layers
* {layerId: sourceId}
*/
function updateMapboxLayers(map) {
var newLayers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var oldLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
// delete no longer existed old layers
if (oldLayers) {
checkAndRemoveOldLayers(map, oldLayers, newLayers);
}
// insert or update new layer
Object.values(newLayers).forEach(function (overlay) {
var layerId = overlay.id,
config = overlay.config,
data = overlay.data,
sourceId = overlay.sourceId,
isVisible = overlay.isVisible;
if (!data && !config) {
return;
}
var _ref = oldLayers && oldLayers[layerId] || {},
oldData = _ref.data,
oldConfig = _ref.config;
if (data && data !== oldData) {
updateSourceData(map, sourceId, data);
}
// compare with previous configs
if (oldConfig !== config) {
updateLayerConfig(map, layerId, config, isVisible);
}
});
}
function checkAndRemoveOldLayers(map, oldLayers, newLayers) {
Object.keys(oldLayers).forEach(function (layerId) {
if (!newLayers[layerId]) {
map.removeLayer(layerId);
}
});
}
function updateLayerConfig(map, layerId, config, isVisible) {
var mapboxLayer = map.getLayer(layerId);
if (mapboxLayer) {
// check if layer already is set
// remove it if exists
map.removeLayer(layerId);
}
map.addLayer(config);
map.setLayoutProperty(layerId, 'visibility', isVisible ? 'visible' : 'none');
}
function updateSourceData(map, sourceId, data) {
var source = map.getSource(sourceId);
if (!source) {
map.addSource(sourceId, {
type: 'geojson',
data: data
});
} else {
source.setData(data);
}
}
/**
*
* @param filteredIndex
* @param getGeometry {({index: number}) => any}
* @param getProperties {({index: number}) => any}
* @returns FeatureCollection
*/
function geoJsonFromData() {
var filteredIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var getGeometry = arguments.length > 1 ? arguments[1] : undefined;
var getProperties = arguments.length > 2 ? arguments[2] : undefined;
var geojson = {
type: 'FeatureCollection',
features: []
};
for (var i = 0; i < filteredIndex.length; i++) {
var index = filteredIndex[i];
var rowIndex = {
index: index
};
var geometry = getGeometry(rowIndex);
if (geometry) {
geojson.features.push({
type: 'Feature',
properties: _objectSpread({
index: index
}, getProperties(rowIndex)),
geometry: geometry
});
}
}
return geojson;
}
var prefixGpuField = exports.prefixGpuField = function prefixGpuField(name) {
return "gpu:".concat(name);
};
function gpuFilterToMapboxFilter(gpuFilter) {
var filterRange = gpuFilter.filterRange,
filterValueUpdateTriggers = gpuFilter.filterValueUpdateTriggers;
var hasFilter = Object.values(filterValueUpdateTriggers).filter(function (d) {
return d;
});
if (!hasFilter.length) {
return null;
}
var condition = ['all'];
// [">=", key, value]
// ["<=", key, value]
var expressions = Object.values(filterValueUpdateTriggers).reduce(function (accu, gpu, i) {
return gpu !== null && gpu !== void 0 && gpu.name ? [].concat((0, _toConsumableArray2["default"])(accu), [['>=', prefixGpuField(gpu.name), filterRange[i][0]], ['<=', prefixGpuField(gpu.name), filterRange[i][1]]]) : accu;
}, condition);
return expressions;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmFzZUxheWVyIiwicmVxdWlyZSIsIl91dGlscyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZ2VuZXJhdGVNYXBib3hMYXllcnMiLCJsYXllcnMiLCJ1bmRlZmluZWQiLCJsYXllckRhdGEiLCJsYXllck9yZGVyIiwibGF5ZXJzVG9SZW5kZXIiLCJzbGljZSIsInJldmVyc2UiLCJsYXllcklkIiwibGF5ZXIiLCJmaW5kQnlJZCIsIm92ZXJsYXlUeXBlIiwiT1ZFUkxBWV9UWVBFX0NPTlNUIiwibWFwYm94Z2wiLCJyZWR1Y2UiLCJhY2MiLCJsYXllckluZGV4IiwiZmluZEluZGV4IiwibCIsImlkIiwiZGF0YSIsImlzVmlzaWJsZSIsImNvbmZpZyIsImhpZGRlbiIsInNvdXJjZUlkIiwic291cmNlIiwidXBkYXRlTWFwYm94TGF5ZXJzIiwibWFwIiwibmV3TGF5ZXJzIiwib2xkTGF5ZXJzIiwiY2hlY2tBbmRSZW1vdmVPbGRMYXllcnMiLCJ2YWx1ZXMiLCJvdmVybGF5IiwiX3JlZiIsIm9sZERhdGEiLCJvbGRDb25maWciLCJ1cGRhdGVTb3VyY2VEYXRhIiwidXBkYXRlTGF5ZXJDb25maWciLCJyZW1vdmVMYXllciIsIm1hcGJveExheWVyIiwiZ2V0TGF5ZXIiLCJhZGRMYXllciIsInNldExheW91dFByb3BlcnR5IiwiZ2V0U291cmNlIiwiYWRkU291cmNlIiwidHlwZSIsInNldERhdGEiLCJnZW9Kc29uRnJvbURhdGEiLCJmaWx0ZXJlZEluZGV4IiwiZ2V0R2VvbWV0cnkiLCJnZXRQcm9wZXJ0aWVzIiwiZ2VvanNvbiIsImZlYXR1cmVzIiwiaSIsImluZGV4Iiwicm93SW5kZXgiLCJnZW9tZXRyeSIsInByb3BlcnRpZXMiLCJwcmVmaXhHcHVGaWVsZCIsImV4cG9ydHMiLCJuYW1lIiwiY29uY2F0IiwiZ3B1RmlsdGVyVG9NYXBib3hGaWx0ZXIiLCJncHVGaWx0ZXIiLCJmaWx0ZXJSYW5nZSIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJoYXNGaWx0ZXIiLCJkIiwiY29uZGl0aW9uIiwiZXhwcmVzc2lvbnMiLCJhY2N1IiwiZ3B1IiwiX3RvQ29uc3VtYWJsZUFycmF5MiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXBib3gtdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IExheWVyLCB7T1ZFUkxBWV9UWVBFX0NPTlNUfSBmcm9tICcuL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHtGZWF0dXJlfSBmcm9tICdnZW9qc29uJztcblxuaW1wb3J0IHtmaW5kQnlJZH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgbGF5ZXJzIHRvIG1hcGJveCBsYXllcnNcbiAqIEBwYXJhbSBsYXllcnMgdGhlIGxheWVycyB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBsYXllckRhdGEgZXh0cmEgbGF5ZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSBsYXllck9yZGVyIHRoZSBvcmRlciBieSB3aGljaCB3ZSBzaG91bGQgY29udmVydCBsYXllcnNcbiAqIEBwYXJhbSBsYXllcnNUb1JlbmRlciB7W2lkXTogdHJ1ZSB8IGZhbHNlfSBvYmplY3Qgd2hldGhlciBlYWNoIGxheWVyIHNob3VsZCBiZSByZW5kZXJlZFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFwYm94TGF5ZXJzKFxuICBsYXllcnM6IExheWVyW10gPSBbXSxcbiAgbGF5ZXJEYXRhOiBhbnlbXSA9IFtdLFxuICBsYXllck9yZGVyOiBzdHJpbmdbXSA9IFtdLFxuICBsYXllcnNUb1JlbmRlcjoge1trZXk6IHN0cmluZ106IGJvb2xlYW59ID0ge31cbik6IHtba2V5OiBzdHJpbmddOiBMYXllcn0ge1xuICBpZiAobGF5ZXJEYXRhLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbGF5ZXJPcmRlclxuICAgICAgLnNsaWNlKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5maWx0ZXIobGF5ZXJJZCA9PiB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gZmluZEJ5SWQobGF5ZXJJZCkobGF5ZXJzKTtcbiAgICAgICAgcmV0dXJuIGxheWVyPy5vdmVybGF5VHlwZSA9PT0gT1ZFUkxBWV9UWVBFX0NPTlNULm1hcGJveGdsICYmIGxheWVyc1RvUmVuZGVyW2xheWVySWRdO1xuICAgICAgfSlcbiAgICAgIC5yZWR1Y2UoKGFjYywgbGF5ZXJJZCkgPT4ge1xuICAgICAgICBjb25zdCBsYXllckluZGV4ID0gbGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGxheWVySWQpO1xuICAgICAgICBpZiAobGF5ZXJJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbbGF5ZXJJbmRleF07XG5cbiAgICAgICAgaWYgKCEobGF5ZXIub3ZlcmxheVR5cGUgPT09IE9WRVJMQVlfVFlQRV9DT05TVC5tYXBib3hnbCAmJiBsYXllcnNUb1JlbmRlcltsYXllcklkXSkpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2xheWVyLmlkXToge1xuICAgICAgICAgICAgaWQ6IGxheWVyLmlkLFxuICAgICAgICAgICAgZGF0YTogbGF5ZXJEYXRhW2xheWVySW5kZXhdLmRhdGEsXG4gICAgICAgICAgICBpc1Zpc2libGU6IGxheWVyLmNvbmZpZy5pc1Zpc2libGUsXG4gICAgICAgICAgICBjb25maWc6IGxheWVyRGF0YVtsYXllckluZGV4XS5jb25maWcsXG4gICAgICAgICAgICBoaWRkZW46IGxheWVyLmNvbmZpZy5oaWRkZW4sXG4gICAgICAgICAgICBzb3VyY2VJZDogbGF5ZXJEYXRhW2xheWVySW5kZXhdLmNvbmZpZy5zb3VyY2VcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LCB7fSk7XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbnR5cGUgbmV3TGF5ZXJzVHlwZSA9IHtcbiAgW2tleTogc3RyaW5nXTogTGF5ZXIgJiBQYXJ0aWFsPHtkYXRhOiBhbnk7IHNvdXJjZUlkOiBhbnk7IGlzVmlzaWJsZTogYm9vbGVhbn0+O1xufTtcbnR5cGUgb2xkTGF5ZXJzVHlwZSA9IHtba2V5OiBzdHJpbmddOiBMYXllciAmIHtkYXRhPzogYW55fX07XG4vKipcbiAqIFVwZGF0ZSBtYXBib3ggbGF5ZXJzIG9uIHRoZSBnaXZlbiBtYXBcbiAqIEBwYXJhbSBtYXBcbiAqIEBwYXJhbSBuZXdMYXllcnMgTWFwIG9mIG5ldyBtYXBib3ggbGF5ZXJzIHRvIGJlIGRpc3BsYXllZFxuICogQHBhcmFtIG9sZExheWVycyBNYXAgb2YgdGhlIG9sZCBsYXllcnMgdG8gYmUgY29tcGFyZSB3aXRoIHRoZSBjdXJyZW50IG9uZXMgdG8gZGV0ZWN0IGRlbGV0ZWQgbGF5ZXJzXG4gKiAgICAgICAgICAgICAgICAgIHtsYXllcklkOiBzb3VyY2VJZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1hcGJveExheWVycyhcbiAgbWFwLFxuICBuZXdMYXllcnM6IG5ld0xheWVyc1R5cGUgPSB7fSxcbiAgb2xkTGF5ZXJzOiBvbGRMYXllcnNUeXBlIHwgbnVsbCA9IG51bGxcbikge1xuICAvLyBkZWxldGUgbm8gbG9uZ2VyIGV4aXN0ZWQgb2xkIGxheWVyc1xuICBpZiAob2xkTGF5ZXJzKSB7XG4gICAgY2hlY2tBbmRSZW1vdmVPbGRMYXllcnMobWFwLCBvbGRMYXllcnMsIG5ld0xheWVycyk7XG4gIH1cblxuICAvLyBpbnNlcnQgb3IgdXBkYXRlIG5ldyBsYXllclxuICBPYmplY3QudmFsdWVzKG5ld0xheWVycykuZm9yRWFjaChvdmVybGF5ID0+IHtcbiAgICBjb25zdCB7aWQ6IGxheWVySWQsIGNvbmZpZywgZGF0YSwgc291cmNlSWQsIGlzVmlzaWJsZX0gPSBvdmVybGF5O1xuICAgIGlmICghZGF0YSAmJiAhY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2RhdGE6IG9sZERhdGEsIGNvbmZpZzogb2xkQ29uZmlnfSA9IChvbGRMYXllcnMgJiYgb2xkTGF5ZXJzW2xheWVySWRdKSB8fCB7fTtcblxuICAgIGlmIChkYXRhICYmIGRhdGEgIT09IG9sZERhdGEpIHtcbiAgICAgIHVwZGF0ZVNvdXJjZURhdGEobWFwLCBzb3VyY2VJZCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB3aXRoIHByZXZpb3VzIGNvbmZpZ3NcbiAgICBpZiAob2xkQ29uZmlnICE9PSBjb25maWcpIHtcbiAgICAgIHVwZGF0ZUxheWVyQ29uZmlnKG1hcCwgbGF5ZXJJZCwgY29uZmlnLCBpc1Zpc2libGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQW5kUmVtb3ZlT2xkTGF5ZXJzKG1hcCwgb2xkTGF5ZXJzOiBvbGRMYXllcnNUeXBlLCBuZXdMYXllcnM6IG5ld0xheWVyc1R5cGUpIHtcbiAgT2JqZWN0LmtleXMob2xkTGF5ZXJzKS5mb3JFYWNoKGxheWVySWQgPT4ge1xuICAgIGlmICghbmV3TGF5ZXJzW2xheWVySWRdKSB7XG4gICAgICBtYXAucmVtb3ZlTGF5ZXIobGF5ZXJJZCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5ZXJDb25maWcobWFwLCBsYXllcklkLCBjb25maWcsIGlzVmlzaWJsZSkge1xuICBjb25zdCBtYXBib3hMYXllciA9IG1hcC5nZXRMYXllcihsYXllcklkKTtcblxuICBpZiAobWFwYm94TGF5ZXIpIHtcbiAgICAvLyBjaGVjayBpZiBsYXllciBhbHJlYWR5IGlzIHNldFxuICAgIC8vIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICBtYXAucmVtb3ZlTGF5ZXIobGF5ZXJJZCk7XG4gIH1cblxuICBtYXAuYWRkTGF5ZXIoY29uZmlnKTtcbiAgbWFwLnNldExheW91dFByb3BlcnR5KGxheWVySWQsICd2aXNpYmlsaXR5JywgaXNWaXNpYmxlID8gJ3Zpc2libGUnIDogJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU291cmNlRGF0YShtYXAsIHNvdXJjZUlkLCBkYXRhKSB7XG4gIGNvbnN0IHNvdXJjZSA9IG1hcC5nZXRTb3VyY2Uoc291cmNlSWQpO1xuXG4gIGlmICghc291cmNlKSB7XG4gICAgbWFwLmFkZFNvdXJjZShzb3VyY2VJZCwge1xuICAgICAgdHlwZTogJ2dlb2pzb24nLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNvdXJjZS5zZXREYXRhKGRhdGEpO1xuICB9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWx0ZXJlZEluZGV4XG4gKiBAcGFyYW0gZ2V0R2VvbWV0cnkgeyh7aW5kZXg6IG51bWJlcn0pID0+IGFueX1cbiAqIEBwYXJhbSBnZXRQcm9wZXJ0aWVzIHsoe2luZGV4OiBudW1iZXJ9KSA9PiBhbnl9XG4gKiBAcmV0dXJucyBGZWF0dXJlQ29sbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VvSnNvbkZyb21EYXRhKFxuICBmaWx0ZXJlZEluZGV4OiBudW1iZXJbXSA9IFtdLFxuICBnZXRHZW9tZXRyeTogKGFyZzoge2luZGV4OiBudW1iZXJ9KSA9PiBhbnksXG4gIGdldFByb3BlcnRpZXM6IChhcmc6IHtpbmRleDogbnVtYmVyfSkgPT4gb2JqZWN0XG4pIHtcbiAgY29uc3QgZ2VvanNvbjoge3R5cGU6IHN0cmluZzsgZmVhdHVyZXM6IEZlYXR1cmVbXX0gPSB7XG4gICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICBmZWF0dXJlczogW11cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmRleCA9IGZpbHRlcmVkSW5kZXhbaV07XG4gICAgY29uc3Qgcm93SW5kZXggPSB7aW5kZXh9O1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkocm93SW5kZXgpO1xuXG4gICAgaWYgKGdlb21ldHJ5KSB7XG4gICAgICBnZW9qc29uLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAuLi5nZXRQcm9wZXJ0aWVzKHJvd0luZGV4KVxuICAgICAgICB9LFxuICAgICAgICBnZW9tZXRyeVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdlb2pzb247XG59XG5cbmV4cG9ydCBjb25zdCBwcmVmaXhHcHVGaWVsZCA9IG5hbWUgPT4gYGdwdToke25hbWV9YDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdwdUZpbHRlclRvTWFwYm94RmlsdGVyKGdwdUZpbHRlcikge1xuICBjb25zdCB7ZmlsdGVyUmFuZ2UsIGZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnN9ID0gZ3B1RmlsdGVyO1xuXG4gIGNvbnN0IGhhc0ZpbHRlciA9IE9iamVjdC52YWx1ZXMoZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycykuZmlsdGVyKGQgPT4gZCk7XG5cbiAgaWYgKCFoYXNGaWx0ZXIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjb25kaXRpb24gPSBbJ2FsbCddO1xuXG4gIC8vIFtcIj49XCIsIGtleSwgdmFsdWVdXG4gIC8vIFtcIjw9XCIsIGtleSwgdmFsdWVdXG4gIGNvbnN0IGV4cHJlc3Npb25zID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzIGFzICh7bmFtZTogc3RyaW5nfSB8IG51bGwpW10pLnJlZHVjZShcbiAgICAoYWNjdTogYW55W10sIGdwdSwgaSkgPT5cbiAgICAgIGdwdT8ubmFtZVxuICAgICAgICA/IFtcbiAgICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgICBbJz49JywgcHJlZml4R3B1RmllbGQoZ3B1Lm5hbWUpLCBmaWx0ZXJSYW5nZVtpXVswXV0sXG4gICAgICAgICAgICBbJzw9JywgcHJlZml4R3B1RmllbGQoZ3B1Lm5hbWUpLCBmaWx0ZXJSYW5nZVtpXVsxXV1cbiAgICAgICAgICBdXG4gICAgICAgIDogYWNjdSxcbiAgICBjb25kaXRpb25cbiAgKTtcblxuICByZXR1cm4gZXhwcmVzc2lvbnM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFBMEMsU0FBQUUsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFB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OUQsSUFBSSxDQUFDO1FBQ3BCdUQsSUFBSSxFQUFFLFNBQVM7UUFDZlksVUFBVSxFQUFBakUsYUFBQTtVQUNSOEQsS0FBSyxFQUFMQTtRQUFLLEdBQ0ZKLGFBQWEsQ0FBQ0ssUUFBUSxDQUFDLENBQzNCO1FBQ0RDLFFBQVEsRUFBUkE7TUFDRixDQUFDLENBQUM7SUFDSjtFQUNGO0VBRUEsT0FBT0wsT0FBTztBQUNoQjtBQUVPLElBQU1PLGNBQWMsR0FBQUMsT0FBQSxDQUFBRCxjQUFBLEdBQUcsU0FBakJBLGNBQWNBLENBQUdFLElBQUk7RUFBQSxjQUFBQyxNQUFBLENBQVdELElBQUk7QUFBQSxDQUFFO0FBRTVDLFNBQVNFLHVCQUF1QkEsQ0FBQ0MsU0FBUyxFQUFFO0VBQ2pELElBQU9DLFdBQVcsR0FBK0JELFNBQVMsQ0FBbkRDLFdBQVc7SUFBRUMseUJBQXlCLEdBQUlGLFNBQVMsQ0FBdENFLHlCQUF5QjtFQUU3QyxJQUFNQyxTQUFTLEdBQUduRixNQUFNLENBQUNnRCxNQUFNLENBQUNrQyx5QkFBeUIsQ0FBQyxDQUFDOUUsTUFBTSxDQUFDLFVBQUFnRixDQUFDO0lBQUEsT0FBSUEsQ0FBQztFQUFBLEVBQUM7RUFFekUsSUFBSSxDQUFDRCxTQUFTLENBQUN4RSxNQUFNLEVBQUU7SUFDckIsT0FBTyxJQUFJO0VBQ2I7RUFFQSxJQUFNMEUsU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDOztFQUV6QjtFQUNBO0VBQ0EsSUFBTUMsV0FBVyxHQUFHdEYsTUFBTSxDQUFDZ0QsTUFBTSxDQUFDa0MseUJBQXNELENBQUMsQ0FBQ25ELE1BQU0sQ0FDOUYsVUFBQ3dELElBQVcsRUFBRUMsR0FBRyxFQUFFbEIsQ0FBQztJQUFBLE9BQ2xCa0IsR0FBRyxhQUFIQSxHQUFHLGVBQUhBLEdBQUcsQ0FBRVgsSUFBSSxNQUFBQyxNQUFBLEtBQUFXLG1CQUFBLGFBRUFGLElBQUksSUFDUCxDQUFDLElBQUksRUFBRVosY0FBYyxDQUFDYSxHQUFHLENBQUNYLElBQUksQ0FBQyxFQUFFSSxXQUFXLENBQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ25ELENBQUMsSUFBSSxFQUFFSyxjQUFjLENBQUNhLEdBQUcsQ0FBQ1gsSUFBSSxDQUFDLEVBQUVJLFdBQVcsQ0FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FFckRpQixJQUFJO0VBQUEsR0FDVkYsU0FDRixDQUFDO0VBRUQsT0FBT0MsV0FBVztBQUNwQiIsImlnbm9yZUxpc3QiOltdfQ==
;