kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
182 lines (154 loc) • 20.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateMapboxLayers = generateMapboxLayers;
exports.updateMapboxLayers = updateMapboxLayers;
exports.geojsonFromPoints = geojsonFromPoints;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _baseLayer = require("./base-layer");
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; }
/**
* 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
* @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] : [];
if (layerData.length > 0) {
return layerOrder.slice().reverse().reduce(function (overlays, idx) {
var layer = layers[idx];
return layer.overlayType !== _baseLayer.OVERLAY_TYPE.mapboxgl ? overlays : [].concat((0, _toConsumableArray2["default"])(overlays), [{
id: layer.id,
data: layerData[idx].data,
config: layerData[idx].config,
datasetId: layer.config.dataId
}]);
}, []);
}
return [];
}
;
/**
* Update mapbox layers on the given map
* @param map
* @param newLayers Array 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: datasetId}
* @param mapLayers carries information about split map view
*/
function updateMapboxLayers(map) {
var newLayers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var oldLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var mapLayers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {
force: true
};
// delete non existing layers
if (oldLayers) {
var oldLayersKeys = Object.keys(oldLayers);
if (newLayers.length === 0 && oldLayersKeys.length > 0) {
oldLayersKeys.forEach(function (layerId) {
return map.removeLayer(layerId);
});
} else {
// remove layers
var currentLayersIds = newLayers.reduce(function (_final, layer) {
return _objectSpread({}, _final, (0, _defineProperty2["default"])({}, layer.id, true));
}, {});
var layersToDelete = oldLayersKeys.reduce(function (_final2, layerId) {
// if layer doesn't exists anymore
if (!currentLayersIds[layerId]) {
return _objectSpread({}, _final2, (0, _defineProperty2["default"])({}, layerId, oldLayers[layerId]));
}
return _final2;
}, []);
Object.keys(layersToDelete).forEach(function (layerId) {
return map.removeLayer(layerId);
});
}
} // insert or update new layer
// TODO: fix complexity
/* eslint-disable complexity */
newLayers.forEach(function (overlay) {
var layerId = overlay.id,
config = overlay.config,
data = overlay.data,
datasetId = overlay.datasetId;
if (!data && !config) {
return;
}
var isAvailableAndVisible = !(mapLayers && mapLayers[layerId]) || mapLayers[layerId].isVisible; // checking if source already exists
if (data && isAvailableAndVisible) {
var source = map.getSource(datasetId);
if (!source) {
map.addSource(datasetId, {
type: 'geojson',
data: data
});
} else {
source.setData(data);
}
}
var oldConfig = oldLayers[layerId];
var mapboxLayer = map.getLayer(layerId); // compare with previous configs
if (!oldConfig || oldConfig !== config || !mapboxLayer || opt.force) {
// check if layer already is set
// remove it if exists
if (mapboxLayer) {
map.removeLayer(layerId);
} // add if visible and available
if (isAvailableAndVisible) {
map.addLayer(config);
}
}
});
/* eslint-enable complexity */
// TODO: think about removing sources
}
;
/**
*
* @param points
* @param columns {
* lat: {fieldIdx},
* lng: {fieldIdx},
* alt: {fieldIdx}
* }
* @param properties [{label: {fieldIdx}]
* @returns {{type: string, properties: {}, features: {type: string, properties: {}, geometry: {type: string, coordinates: *[]}}[]}}
*/
function geojsonFromPoints() {
var allData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var filteredIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var columns = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var properties = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
return {
type: 'FeatureCollection',
features: filteredIndex.map(function (index) {
return allData[index];
}).map(function (point) {
return {
type: 'Feature',
properties: properties.reduce(function (_final3, property) {
return _objectSpread({}, _final3, (0, _defineProperty2["default"])({}, property.name, point[property.tableFieldIndex - 1]));
}, {}),
geometry: {
type: 'Point',
coordinates: [columns.lng ? point[columns.lng.fieldIdx] : null, // lng
columns.lat ? point[columns.lat.fieldIdx] : null, // lat
columns.altitude ? point[columns.altitude.fieldIdx] : 0 // altitude
]
}
};
})
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvbWFwYm94LXV0aWxzLmpzIl0sIm5hbWVzIjpbImdlbmVyYXRlTWFwYm94TGF5ZXJzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGF5ZXJPcmRlciIsImxlbmd0aCIsInNsaWNlIiwicmV2ZXJzZSIsInJlZHVjZSIsIm92ZXJsYXlzIiwiaWR4IiwibGF5ZXIiLCJvdmVybGF5VHlwZSIsIk9WRVJMQVlfVFlQRSIsIm1hcGJveGdsIiwiaWQiLCJkYXRhIiwiY29uZmlnIiwiZGF0YXNldElkIiwiZGF0YUlkIiwidXBkYXRlTWFwYm94TGF5ZXJzIiwibWFwIiwibmV3TGF5ZXJzIiwib2xkTGF5ZXJzIiwibWFwTGF5ZXJzIiwib3B0IiwiZm9yY2UiLCJvbGRMYXllcnNLZXlzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJsYXllcklkIiwicmVtb3ZlTGF5ZXIiLCJjdXJyZW50TGF5ZXJzSWRzIiwiZmluYWwiLCJsYXllcnNUb0RlbGV0ZSIsIm92ZXJsYXkiLCJpc0F2YWlsYWJsZUFuZFZpc2libGUiLCJpc1Zpc2libGUiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJhZGRTb3VyY2UiLCJ0eXBlIiwic2V0RGF0YSIsIm9sZENvbmZpZyIsIm1hcGJveExheWVyIiwiZ2V0TGF5ZXIiLCJhZGRMYXllciIsImdlb2pzb25Gcm9tUG9pbnRzIiwiYWxsRGF0YSIsImZpbHRlcmVkSW5kZXgiLCJjb2x1bW5zIiwicHJvcGVydGllcyIsImZlYXR1cmVzIiwiaW5kZXgiLCJwb2ludCIsInByb3BlcnR5IiwibmFtZSIsInRhYmxlRmllbGRJbmRleCIsImdlb21ldHJ5IiwiY29vcmRpbmF0ZXMiLCJsbmciLCJmaWVsZElkeCIsImxhdCIsImFsdGl0dWRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7OztBQUVBOzs7Ozs7O0FBT08sU0FBU0Esb0JBQVQsR0FBNEU7QUFBQSxNQUE5Q0MsTUFBOEMsdUVBQXJDLEVBQXFDO0FBQUEs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VCxLQUFLLENBQUNKLE9BQU8sQ0FBQ2EsUUFBUixDQUFpQkYsUUFBbEIsQ0FBeEIsR0FBc0QsQ0FIM0MsQ0FHNkM7QUFIN0M7QUFGTDtBQU51RCxPQUFMO0FBQUEsS0FBcEQ7QUFGTCxHQUFQO0FBa0JEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtPVkVSTEFZX1RZUEV9IGZyb20gJy4vYmFzZS1sYXllcic7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgbGF5ZXJzIHRvIG1hcGJveCBsYXllcnNcbiAqIEBwYXJhbSBsYXllcnMgdGhlIGxheWVycyB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBsYXllckRhdGEgZXh0cmEgbGF5ZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSBsYXllck9yZGVyIHRoZSBvcmRlciBieSB3aGljaCB3ZSBzaG91bGQgY29udmVydCBsYXllcnNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXBib3hMYXllcnMobGF5ZXJzID0gW10sIGxheWVyRGF0YSA9IFtdLCBsYXllck9yZGVyID0gW10pIHtcbiAgaWYgKGxheWVyRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGxheWVyT3JkZXIuc2xpY2UoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLnJlZHVjZSgob3ZlcmxheXMsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tpZHhdO1xuXG4gICAgICAgIHJldHVybiBsYXllci5vdmVybGF5VHlwZSAhPT0gT1ZFUkxBWV9UWVBFLm1hcGJveGdsID9cbiAgICAgICAgICBvdmVybGF5c1xuICAgICAgICAgIDogW1xuICAgICAgICAgICAgLi4ub3ZlcmxheXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgICAgICAgICAgZGF0YTogbGF5ZXJEYXRhW2lkeF0uZGF0YSxcbiAgICAgICAgICAgICAgY29uZmlnOiBsYXllckRhdGFbaWR4XS5jb25maWcsXG4gICAgICAgICAgICAgIGRhdGFzZXRJZDogbGF5ZXIuY29uZmlnLmRhdGFJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgIH0sIFtdKTtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIG1hcGJveCBsYXllcnMgb24gdGhlIGdpdmVuIG1hcFxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG5ld0xheWVycyBBcnJheSBvZiBuZXcgbWFwYm94IGxheWVycyB0byBiZSBkaXNwbGF5ZWRcbiAqIEBwYXJhbSBvbGRMYXllcnMgTWFwIG9mIHRoZSBvbGQgbGF5ZXJzIHRvIGJlIGNvbXBhcmUgd2l0aCB0aGUgY3VycmVudCBvbmVzIHRvIGRldGVjdCBkZWxldGVkIGxheWVyc1xuICogICAgICAgICAgICAgICAgICB7bGF5ZXJJZDogZGF0YXNldElkfVxuICogQHBhcmFtIG1hcExheWVycyBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHNwbGl0IG1hcCB2aWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNYXBib3hMYXllcnMobWFwLCBuZXdMYXllcnMgPSBbXSwgb2xkTGF5ZXJzID0gbnVsbCwgbWFwTGF5ZXJzID0gbnVsbCwgb3B0ID0ge2ZvcmNlOiB0cnVlfSkge1xuICAvLyBkZWxldGUgbm9uIGV4aXN0aW5nIGxheWVyc1xuXG4gIGlmIChvbGRMYXllcnMpIHtcbiAgICBjb25zdCBvbGRMYXllcnNLZXlzID0gT2JqZWN0LmtleXMob2xkTGF5ZXJzKTtcbiAgICBpZiAobmV3TGF5ZXJzLmxlbmd0aCA9PT0gMCAmJiBvbGRMYXllcnNLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZExheWVyc0tleXMuZm9yRWFjaChsYXllcklkID0+IG1hcC5yZW1vdmVMYXllcihsYXllcklkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlbW92ZSBsYXllcnNcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllcnNJZHMgPSBuZXdMYXllcnMucmVkdWNlKChmaW5hbCwgbGF5ZXIpID0+ICh7XG4gICAgICAgIC4uLmZpbmFsLFxuICAgICAgICBbbGF5ZXIuaWRdOiB0cnVlXG4gICAgICB9KSwge30pO1xuXG4gICAgICBjb25zdCBsYXllcnNUb0RlbGV0ZSA9IG9sZExheWVyc0tleXMucmVkdWNlKChmaW5hbCwgbGF5ZXJJZCkgPT4ge1xuICAgICAgICAvLyBpZiBsYXllciBkb2Vzbid0IGV4aXN0cyBhbnltb3JlXG4gICAgICAgIGlmICghY3VycmVudExheWVyc0lkc1tsYXllcklkXSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5maW5hbCxcbiAgICAgICAgICAgIFtsYXllcklkXTogb2xkTGF5ZXJzW2xheWVySWRdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICB9LCBbXSk7XG4gICAgICBPYmplY3Qua2V5cyhsYXllcnNUb0RlbGV0ZSkuZm9yRWFjaChsYXllcklkID0+IG1hcC5yZW1vdmVMYXllcihsYXllcklkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zZXJ0IG9yIHVwZGF0ZSBuZXcgbGF5ZXJcbiAgLy8gVE9ETzogZml4IGNvbXBsZXhpdHlcbiAgLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuICBuZXdMYXllcnMuZm9yRWFjaChvdmVybGF5ID0+IHtcbiAgICBjb25zdCB7aWQ6IGxheWVySWQsIGNvbmZpZywgZGF0YSwgZGF0YXNldElkfSA9IG92ZXJsYXk7XG4gICAgaWYgKCFkYXRhICYmICFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNBdmFpbGFibGVBbmRWaXNpYmxlID1cbiAgICAgICEobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllcklkXSkgfHwgbWFwTGF5ZXJzW2xheWVySWRdLmlzVmlzaWJsZTtcbiAgICAvLyBjaGVja2luZyBpZiBzb3VyY2UgYWxyZWFkeSBleGlzdHNcblxuICAgIGlmIChkYXRhICYmIGlzQXZhaWxhYmxlQW5kVmlzaWJsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gbWFwLmdldFNvdXJjZShkYXRhc2V0SWQpO1xuICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgbWFwLmFkZFNvdXJjZShkYXRhc2V0SWQsIHtcbiAgICAgICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzb3VyY2Uuc2V0RGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb25maWcgPSBvbGRMYXllcnNbbGF5ZXJJZF07XG4gICAgY29uc3QgbWFwYm94TGF5ZXIgPSBtYXAuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgLy8gY29tcGFyZSB3aXRoIHByZXZpb3VzIGNvbmZpZ3NcblxuICAgIGlmICghb2xkQ29uZmlnIHx8IG9sZENvbmZpZyAhPT0gY29uZmlnIHx8ICFtYXBib3hMYXllciB8fCBvcHQuZm9yY2UpIHtcbiAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGFscmVhZHkgaXMgc2V0XG4gICAgICAvLyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICBpZiAobWFwYm94TGF5ZXIpIHtcbiAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVySWQpO1xuICAgICAgfVxuICAgICAgLy8gYWRkIGlmIHZpc2libGUgYW5kIGF2YWlsYWJsZVxuICAgICAgaWYgKGlzQXZhaWxhYmxlQW5kVmlzaWJsZSkge1xuICAgICAgICBtYXAuYWRkTGF5ZXIoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cbiAgLy8gVE9ETzogdGhpbmsgYWJvdXQgcmVtb3Zpbmcgc291cmNlc1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHBvaW50c1xuICogQHBhcmFtIGNvbHVtbnMge1xuICogbGF0OiB7ZmllbGRJZHh9LFxuICogbG5nOiB7ZmllbGRJZHh9LFxuICogYWx0OiB7ZmllbGRJZHh9XG4gKiB9XG4gKiBAcGFyYW0gcHJvcGVydGllcyBbe2xhYmVsOiB7ZmllbGRJZHh9XVxuICogQHJldHVybnMge3t0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IHt9LCBmZWF0dXJlczoge3R5cGU6IHN0cmluZywgcHJvcGVydGllczoge30sIGdlb21ldHJ5OiB7dHlwZTogc3RyaW5nLCBjb29yZGluYXRlczogKltdfX1bXX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uRnJvbVBvaW50cyhhbGxEYXRhID0gW10sIGZpbHRlcmVkSW5kZXggPSBbXSwgY29sdW1ucyA9IHt9LCBwcm9wZXJ0aWVzID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBmaWx0ZXJlZEluZGV4Lm1hcChpbmRleCA9PiBhbGxEYXRhW2luZGV4XSkubWFwKHBvaW50ID0+ICh7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLnJlZHVjZSgoZmluYWwsIHByb3BlcnR5KSA9PiAoe1xuICAgICAgICAuLi5maW5hbCxcbiAgICAgICAgW3Byb3BlcnR5Lm5hbWVdOiBwb2ludFtwcm9wZXJ0eS50YWJsZUZpZWxkSW5kZXggLSAxXVxuICAgICAgfSksIHt9KSxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgICAgY29sdW1ucy5sbmcgPyBwb2ludFtjb2x1bW5zLmxuZy5maWVsZElkeF0gOiBudWxsLCAvLyBsbmdcbiAgICAgICAgICBjb2x1bW5zLmxhdCA/IHBvaW50W2NvbHVtbnMubGF0LmZpZWxkSWR4XSA6IG51bGwsIC8vIGxhdFxuICAgICAgICAgIGNvbHVtbnMuYWx0aXR1ZGUgPyBwb2ludFtjb2x1bW5zLmFsdGl0dWRlLmZpZWxkSWR4XSA6IDAgLy8gYWx0aXR1ZGVcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pKVxuICB9O1xufVxuIl19