kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
144 lines (141 loc) • 19.2 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LisaToolComponent = LisaToolComponent;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = require("react");
var _reactRedux = require("react-redux");
var _actions = require("@kepler.gl/actions");
var _utils = require("./utils");
var _layerCreationTool = require("./kepler-tools/layer-creation-tool");
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
/**
* Use LisaToolComponent adding Lisa result to kepler.gl
*/
function LisaToolComponent(_ref) {
var datasetName = _ref.datasetName,
lisaDatasetName = _ref.lisaDatasetName,
significanceThreshold = _ref.significanceThreshold,
clusters = _ref.clusters,
lagValues = _ref.lagValues,
pValues = _ref.pValues,
lisaValues = _ref.lisaValues,
sigCategories = _ref.sigCategories,
nn = _ref.nn,
labels = _ref.labels,
colors = _ref.colors;
var datasets = (0, _reactRedux.useSelector)(function (state) {
return state.demo.keplerGl.map.visState.datasets;
});
var layers = (0, _reactRedux.useSelector)(function (state) {
return state.demo.keplerGl.map.visState.layers;
});
var dispatch = (0, _reactRedux.useDispatch)();
// save the result from lisa tool to a new lisa dataset
(0, _react.useEffect)(function () {
var lisaData = {
clusters: clusters,
lagValues: lagValues,
pValues: pValues,
lisaValues: lisaValues,
sigCategories: sigCategories,
nn: nn,
fillColor: clusters.map(function (cluster, index) {
return pValues[index] < significanceThreshold ? colors[cluster] : colors[0];
}),
label: clusters.map(function (cluster, index) {
return pValues[index] < significanceThreshold ? labels[cluster] : labels[0];
})
};
// create a new geojson layer using clusters with ordinal color scale and customColorScale and colors
var newDataset = (0, _utils.saveAsDataset)(datasets, layers, datasetName, lisaDatasetName, lisaData);
if (newDataset) {
// add the new dataset to the map
dispatch((0, _actions.addDataToMap)({
datasets: [newDataset],
options: {
autoCreateLayers: false,
centerMap: false
}
}));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
// create a LISA layer for the new lisa dataset
(0, _react.useEffect)(function () {
var datasetId = Object.keys(datasets).find(function (dataId) {
return datasets[dataId].label === lisaDatasetName;
});
if (!datasetId) return;
var newDataset = datasets[datasetId];
if (newDataset) {
var layerId = "".concat(lisaDatasetName, "_lisa");
// check if the layer already exists?
if (layers.find(function (l) {
return l.id === layerId;
})) {
return;
}
// add a new layer for the new dataset
var layer = (0, _layerCreationTool.guessDefaultLayer)(newDataset, 'geojson');
if (!layer) return;
var colorField = {
name: 'clusters',
type: 'integer'
};
var colorDomain = Array.from({
length: colors.length
}, function (_, i) {
return i;
});
var colorLegends = {};
for (var i = 0; i < colors.length; i++) {
colorLegends[colors[i]] = labels[i];
}
var colorMap = colors.map(function (color, index) {
return [index, color];
});
var newLayer = {
id: layerId,
type: layer.type,
config: _objectSpread(_objectSpread({}, layer.config), {}, {
dataId: datasetId,
columns: Object.keys(layer.config.columns).reduce(function (acc, key) {
acc[key] = layer.config.columns[key].value;
return acc;
}, {}),
colorScale: 'customOrdinal',
colorField: colorField,
strokeColorDomain: colorDomain,
strokeColorField: colorField,
strokeColorScale: 'customOrdinal',
visConfig: _objectSpread(_objectSpread({}, layer.config.visConfig), {}, {
colorRange: _objectSpread(_objectSpread({}, layer.config.visConfig.colorRange), {}, {
colorDomain: colorDomain,
colors: colors,
colorMap: colorMap,
colorLegends: colorLegends
}),
strokeColorRange: {
category: 'Custom',
name: 'custom',
colors: colors,
colorMap: colorMap
},
strokeOpacity: 1,
stroked: true,
strokedWidth: 0.5
})
})
};
dispatch((0, _actions.addLayer)(newLayer, datasetId));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [datasets]);
return null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0UmVkdXgiLCJfYWN0aW9ucyIsIl91dGlscyIsIl9sYXllckNyZWF0aW9uVG9vbCIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiTGlzYVRvb2xDb21wb25lbnQiLCJfcmVmIiwiZGF0YXNldE5hbWUiLCJsaXNhRGF0YXNldE5hbWUiLCJzaWduaWZpY2FuY2VUaHJlc2hvbGQiLCJjbHVzdGVycyIsImxhZ1ZhbHVlcyIsInBWYWx1ZXMiLCJsaXNhVmFsdWVzIiwic2lnQ2F0ZWdvcmllcyIsIm5uIiwibGFiZWxzIiwiY29sb3JzIiwiZGF0YXNldHMiLCJ1c2VTZWxlY3RvciIsInN0YXRlIiwiZGVtbyIsImtlcGxlckdsIiwibWFwIiwidmlzU3RhdGUiLCJsYXllcnMiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwidXNlRWZmZWN0IiwibGlzYURhdGEiLCJmaWxsQ29sb3IiLCJjbHVzdGVyIiwiaW5kZXgiLCJsYWJlbCIsIm5ld0RhdGFzZXQiLCJzYXZlQXNEYXRhc2V0IiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJkYXRhc2V0SWQiLCJmaW5kIiwiZGF0YUlkIiwibGF5ZXJJZCIsImNvbmNhdCIsImwiLCJpZCIsImxheWVyIiwiZ3Vlc3NEZWZhdWx0TGF5ZXIiLCJjb2xvckZpZWxkIiwibmFtZSIsInR5cGUiLCJjb2xvckRvbWFpbiIsIkFycmF5IiwiZnJvbSIsIl8iLCJpIiwiY29sb3JMZWdlbmRzIiwiY29sb3JNYXAiLCJjb2xvciIsIm5ld0xheWVyIiwiY29uZmlnIiwiY29sdW1ucyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiY29sb3JTY2FsZSIsInN0cm9rZUNvbG9yRG9tYWluIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yU2NhbGUiLCJ2aXNDb25maWciLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsImNhdGVnb3J5Iiwic3Ryb2tlT3BhY2l0eSIsInN0cm9rZWQiLCJzdHJva2VkV2lkdGgiLCJhZGRMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9saXNhLXRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNoLCB1c2VTZWxlY3Rvcn0gZnJvbSAncmVhY3QtcmVkdXgnO1xuaW1wb3J0IHthZGREYXRhVG9NYXAsIGFkZExheWVyfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtzYXZlQXNEYXRhc2V0fSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7Z3Vlc3NEZWZhdWx0TGF5ZXJ9IGZyb20gJy4va2VwbGVyLXRvb2xzL2xheWVyLWNyZWF0aW9uLXRvb2wnO1xuaW1wb3J0IHtTdGF0ZX0gZnJvbSAnLi4vY29tcG9uZW50cy9haS1hc3Npc3RhbnQtbWFuYWdlcic7XG5cbi8qKlxuICogVXNlIExpc2FUb29sQ29tcG9uZW50IGFkZGluZyBMaXNhIHJlc3VsdCB0byBrZXBsZXIuZ2xcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIExpc2FUb29sQ29tcG9uZW50KHtcbiAgZGF0YXNldE5hbWUsXG4gIGxpc2FEYXRhc2V0TmFtZSxcbiAgc2lnbmlmaWNhbmNlVGhyZXNob2xkLFxuICBjbHVzdGVycyxcbiAgbGFnVmFsdWVzLFxuICBwVmFsdWVzLFxuICBsaXNhVmFsdWVzLFxuICBzaWdDYXRlZ29yaWVzLFxuICBubixcbiAgbGFiZWxzLFxuICBjb2xvcnNcbn0pIHtcbiAgY29uc3QgZGF0YXNldHMgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IGxheWVycyA9IHVzZVNlbGVjdG9yKChzdGF0ZTogU3RhdGUpID0+IHN0YXRlLmRlbW8ua2VwbGVyR2wubWFwLnZpc1N0YXRlLmxheWVycyk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICAvLyBzYXZlIHRoZSByZXN1bHQgZnJvbSBsaXNhIHRvb2wgdG8gYSBuZXcgbGlzYSBkYXRhc2V0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbGlzYURhdGE6IFJlY29yZDxzdHJpbmcsIG51bWJlcltdPiA9IHtcbiAgICAgIGNsdXN0ZXJzLFxuICAgICAgbGFnVmFsdWVzLFxuICAgICAgcFZhbHVlcyxcbiAgICAgIGxpc2FWYWx1ZXMsXG4gICAgICBzaWdDYXRlZ29yaWVzLFxuICAgICAgbm4sXG4gICAgICBmaWxsQ29sb3I6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gY29sb3JzW2NsdXN0ZXJdIDogY29sb3JzWzBdXG4gICAgICApLFxuICAgICAgbGFiZWw6IGNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+XG4gICAgICAgIHBWYWx1ZXNbaW5kZXhdIDwgc2lnbmlmaWNhbmNlVGhyZXNob2xkID8gbGFiZWxzW2NsdXN0ZXJdIDogbGFiZWxzWzBdXG4gICAgICApXG4gICAgfTtcbiAgICAvLyBjcmVhdGUgYSBuZXcgZ2VvanNvbiBsYXllciB1c2luZyBjbHVzdGVycyB3aXRoIG9yZGluYWwgY29sb3Igc2NhbGUgYW5kIGN1c3RvbUNvbG9yU2NhbGUgYW5kIGNvbG9yc1xuICAgIGNvbnN0IG5ld0RhdGFzZXQgPSBzYXZlQXNEYXRhc2V0KGRhdGFzZXRzLCBsYXllcnMsIGRhdGFzZXROYW1lLCBsaXNhRGF0YXNldE5hbWUsIGxpc2FEYXRhKTtcbiAgICBpZiAobmV3RGF0YXNldCkge1xuICAgICAgLy8gYWRkIHRoZSBuZXcgZGF0YXNldCB0byB0aGUgbWFwXG4gICAgICBkaXNwYXRjaChcbiAgICAgICAgYWRkRGF0YVRvTWFwKHtkYXRhc2V0czogW25ld0RhdGFzZXRdLCBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogZmFsc2UsIGNlbnRlck1hcDogZmFsc2V9fSlcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIC8vIGNyZWF0ZSBhIExJU0EgbGF5ZXIgZm9yIHRoZSBuZXcgbGlzYSBkYXRhc2V0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZGF0YXNldElkID0gT2JqZWN0LmtleXMoZGF0YXNldHMpLmZpbmQoXG4gICAgICBkYXRhSWQgPT4gZGF0YXNldHNbZGF0YUlkXS5sYWJlbCA9PT0gbGlzYURhdGFzZXROYW1lXG4gICAgKTtcbiAgICBpZiAoIWRhdGFzZXRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3RGF0YXNldCA9IGRhdGFzZXRzW2RhdGFzZXRJZF07XG4gICAgaWYgKG5ld0RhdGFzZXQpIHtcbiAgICAgIGNvbnN0IGxheWVySWQgPSBgJHtsaXNhRGF0YXNldE5hbWV9X2xpc2FgO1xuICAgICAgLy8gY2hlY2sgaWYgdGhlIGxheWVyIGFscmVhZHkgZXhpc3RzP1xuICAgICAgaWYgKGxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gbGF5ZXJJZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gYWRkIGEgbmV3IGxheWVyIGZvciB0aGUgbmV3IGRhdGFzZXRcbiAgICAgIGNvbnN0IGxheWVyID0gZ3Vlc3NEZWZhdWx0TGF5ZXIobmV3RGF0YXNldCwgJ2dlb2pzb24nKTtcbiAgICAgIGlmICghbGF5ZXIpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbG9yRmllbGQgPSB7XG4gICAgICAgIG5hbWU6ICdjbHVzdGVycycsXG4gICAgICAgIHR5cGU6ICdpbnRlZ2VyJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbG9yRG9tYWluID0gQXJyYXkuZnJvbSh7bGVuZ3RoOiBjb2xvcnMubGVuZ3RofSwgKF8sIGkpID0+IGkpO1xuICAgICAgY29uc3QgY29sb3JMZWdlbmRzID0ge307XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2xvckxlZ2VuZHNbY29sb3JzW2ldXSA9IGxhYmVsc1tpXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbG9yTWFwID0gY29sb3JzLm1hcCgoY29sb3IsIGluZGV4KSA9PiBbaW5kZXgsIGNvbG9yXSk7XG4gICAgICBjb25zdCBuZXdMYXllciA9IHtcbiAgICAgICAgaWQ6IGxheWVySWQsXG4gICAgICAgIHR5cGU6IGxheWVyLnR5cGUsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIC4uLmxheWVyLmNvbmZpZyxcbiAgICAgICAgICBkYXRhSWQ6IGRhdGFzZXRJZCxcbiAgICAgICAgICBjb2x1bW5zOiBPYmplY3Qua2V5cyhsYXllci5jb25maWcuY29sdW1ucykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBsYXllci5jb25maWcuY29sdW1uc1trZXldLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgY29sb3JTY2FsZTogJ2N1c3RvbU9yZGluYWwnLFxuICAgICAgICAgIGNvbG9yRmllbGQsXG4gICAgICAgICAgc3Ryb2tlQ29sb3JEb21haW46IGNvbG9yRG9tYWluLFxuICAgICAgICAgIHN0cm9rZUNvbG9yRmllbGQ6IGNvbG9yRmllbGQsXG4gICAgICAgICAgc3Ryb2tlQ29sb3JTY2FsZTogJ2N1c3RvbU9yZGluYWwnLFxuICAgICAgICAgIHZpc0NvbmZpZzoge1xuICAgICAgICAgICAgLi4ubGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICAgICAgICAgIGNvbG9yUmFuZ2U6IHtcbiAgICAgICAgICAgICAgLi4ubGF5ZXIuY29uZmlnLnZpc0NvbmZpZy5jb2xvclJhbmdlLFxuICAgICAgICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgICAgICAgY29sb3JzLFxuICAgICAgICAgICAgICBjb2xvck1hcCxcbiAgICAgICAgICAgICAgY29sb3JMZWdlbmRzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Ryb2tlQ29sb3JSYW5nZToge1xuICAgICAgICAgICAgICBjYXRlZ29yeTogJ0N1c3RvbScsXG4gICAgICAgICAgICAgIG5hbWU6ICdjdXN0b20nLFxuICAgICAgICAgICAgICBjb2xvcnMsXG4gICAgICAgICAgICAgIGNvbG9yTWFwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgICAgICAgICAgIHN0cm9rZWQ6IHRydWUsXG4gICAgICAgICAgICBzdHJva2VkV2lkdGg6IDAuNVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGRpc3BhdGNoKGFkZExheWVyKG5ld0xheWVyLCBkYXRhc2V0SWQpKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZGF0YXNldHNdKTtcbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0Es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QUM7TUFDN0QsSUFBTUMsUUFBUSxHQUFHO1FBQ2ZkLEVBQUUsRUFBRUgsT0FBTztRQUNYUSxJQUFJLEVBQUVKLEtBQUssQ0FBQ0ksSUFBSTtRQUNoQlUsTUFBTSxFQUFBaEUsYUFBQSxDQUFBQSxhQUFBLEtBQ0RrRCxLQUFLLENBQUNjLE1BQU07VUFDZm5CLE1BQU0sRUFBRUYsU0FBUztVQUNqQnNCLE9BQU8sRUFBRTFFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMEQsS0FBSyxDQUFDYyxNQUFNLENBQUNDLE9BQU8sQ0FBQyxDQUFDQyxNQUFNLENBQUMsVUFBQ0MsR0FBRyxFQUFFQyxHQUFHLEVBQUs7WUFDOURELEdBQUcsQ0FBQ0MsR0FBRyxDQUFDLEdBQUdsQixLQUFLLENBQUNjLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDRyxHQUFHLENBQUMsQ0FBQ0MsS0FBSztZQUMxQyxPQUFPRixHQUFHO1VBQ1osQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1VBQ05HLFVBQVUsRUFBRSxlQUFlO1VBQzNCbEIsVUFBVSxFQUFWQSxVQUFVO1VBQ1ZtQixpQkFBaUIsRUFBRWhCLFdBQVc7VUFDOUJpQixnQkFBZ0IsRUFBRXBCLFVBQVU7VUFDNUJxQixnQkFBZ0IsRUFBRSxlQUFlO1VBQ2pDQyxTQUFTLEVBQUExRSxhQUFBLENBQUFBLGFBQUEsS0FDSmtELEtBQUssQ0FBQ2MsTUFBTSxDQUFDVSxTQUFTO1lBQ3pCQyxVQUFVLEVBQUEzRSxhQUFBLENBQUFBLGFBQUEsS0FDTGtELEtBQUssQ0FBQ2MsTUFBTSxDQUFDVSxTQUFTLENBQUNDLFVBQVU7Y0FDcENwQixXQUFXLEVBQVhBLFdBQVc7Y0FDWG5DLE1BQU0sRUFBTkEsTUFBTTtjQUNOeUMsUUFBUSxFQUFSQSxRQUFRO2NBQ1JELFlBQVksRUFBWkE7WUFBWSxFQUNiO1lBQ0RnQixnQkFBZ0IsRUFBRTtjQUNoQkMsUUFBUSxFQUFFLFFBQVE7Y0FDbEJ4QixJQUFJLEVBQUUsUUFBUTtjQUNkakMsTUFBTSxFQUFOQSxNQUFNO2NBQ055QyxRQUFRLEVBQVJBO1lBQ0YsQ0FBQztZQUNEaUIsYUFBYSxFQUFFLENBQUM7WUFDaEJDLE9BQU8sRUFBRSxJQUFJO1lBQ2JDLFlBQVksRUFBRTtVQUFHO1FBQ2xCO01BRUwsQ0FBQztNQUNEbkQsUUFBUSxDQUFDLElBQUFvRCxpQkFBUSxFQUFDbEIsUUFBUSxFQUFFcEIsU0FBUyxDQUFDLENBQUM7SUFDekM7SUFDQTtFQUNGLENBQUMsRUFBRSxDQUFDdEIsUUFBUSxDQUFDLENBQUM7RUFDZCxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
;