kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
181 lines (149 loc) • 22.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.findDefaultLayer = findDefaultLayer;
exports.calculateLayerData = calculateLayerData;
exports.getLayerHoverProp = getLayerHoverProp;
exports.renderDeckGlLayer = renderDeckGlLayer;
exports.isLayerRenderable = isLayerRenderable;
exports.isLayerVisible = isLayerVisible;
exports.prepareLayersForDeck = prepareLayersForDeck;
exports.prepareLayersToRender = prepareLayersToRender;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _baseLayer = require("../layers/base-layer");
var _defaultSettings = require("../constants/default-settings");
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; }
/**
* Find default layers from fields
* @type {typeof import('./layer-utils').findDefaultLayer}
*/
function findDefaultLayer(dataset, layerClasses) {
if (!dataset) {
return [];
}
var layerProps = Object.keys(layerClasses).reduce(function (previous, lc) {
var result = typeof layerClasses[lc].findDefaultLayerProps === 'function' ? layerClasses[lc].findDefaultLayerProps(dataset, previous) : {
props: []
};
var props = Array.isArray(result) ? result : result.props || [];
var foundLayers = result.foundLayers || previous;
return foundLayers.concat(props.map(function (p) {
return _objectSpread(_objectSpread({}, p), {}, {
type: lc,
dataId: dataset.id
});
}));
}, []); // go through all layerProps to create layer
return layerProps.map(function (props) {
var layer = new layerClasses[props.type](props);
return typeof layer.setInitialLayerConfig === 'function' && dataset.dataContainer ? layer.setInitialLayerConfig(dataset) : layer;
});
}
/**
* calculate layer data based on layer type, col Config,
* return updated layer if colorDomain, dataMap has changed
* @type {typeof import('./layer-utils').calculateLayerData}
*/
function calculateLayerData(layer, state, oldLayerData) {
var type = layer.type;
if (!type || !layer.hasAllColumns() || !layer.config.dataId) {
return {
layer: layer,
layerData: {}
};
}
var layerData = layer.formatLayerData(state.datasets, oldLayerData);
return {
layerData: layerData,
layer: layer
};
}
/**
* Calculate props passed to LayerHoverInfo
* @type {typeof import('./layer-utils').getLayerHoverProp}
*/
function getLayerHoverProp(_ref) {
var interactionConfig = _ref.interactionConfig,
hoverInfo = _ref.hoverInfo,
layers = _ref.layers,
layersToRender = _ref.layersToRender,
datasets = _ref.datasets;
if (interactionConfig.tooltip.enabled && hoverInfo && hoverInfo.picked) {
// if anything hovered
var object = hoverInfo.object,
overlay = hoverInfo.layer; // deckgl layer to kepler-gl layer
var layer = layers[overlay.props.idx];
if (object && layer && layer.getHoverData && layersToRender[layer.id]) {
// if layer is visible and have hovered data
var dataId = layer.config.dataId;
if (!dataId) {
return null;
}
var _datasets$dataId = datasets[dataId],
dataContainer = _datasets$dataId.dataContainer,
fields = _datasets$dataId.fields;
var data = layer.getHoverData(object, dataContainer, fields);
var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
return {
data: data,
fields: fields,
fieldsToShow: fieldsToShow,
layer: layer
};
}
}
return null;
}
function renderDeckGlLayer(props, layerCallbacks, idx) {
var datasets = props.datasets,
layers = props.layers,
layerData = props.layerData,
hoverInfo = props.hoverInfo,
clicked = props.clicked,
mapState = props.mapState,
interactionConfig = props.interactionConfig,
animationConfig = props.animationConfig,
mapLayers = props.mapLayers;
var layer = layers[idx];
var data = layerData[idx];
var _ref2 = datasets[layer.config.dataId] || {},
gpuFilter = _ref2.gpuFilter;
var objectHovered = clicked || hoverInfo;
var visible = !mapLayers || mapLayers && mapLayers[layer.id]; // Layer is Layer class
return layer.renderLayer({
data: data,
gpuFilter: gpuFilter,
idx: idx,
interactionConfig: interactionConfig,
layerCallbacks: layerCallbacks,
mapState: mapState,
animationConfig: animationConfig,
objectHovered: objectHovered,
visible: visible
});
}
function isLayerRenderable(layer, layerData) {
return layer.id !== _defaultSettings.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData);
}
function isLayerVisible(layer, mapLayers) {
return layer.config.isVisible && ( // if layer.id is not in mapLayers, don't render it
!mapLayers || mapLayers && mapLayers[layer.id]);
} // Prepare a dict of layers rendered by the deck.gl
// Note, isVisible: false layer is passed to deck.gl here
// return {[id]: true \ false}
function prepareLayersForDeck(layers, layerData) {
return layers.reduce(function (accu, layer, idx) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && layer.overlayType === _baseLayer.OVERLAY_TYPE.deckgl));
}, {});
} // Prepare a dict of rendered layers rendered in the map
// This includes only the visibile layers for single map view and split map view
// return {[id]: true \ false}
function prepareLayersToRender(layers, layerData, mapLayers) {
return layers.reduce(function (accu, layer, idx) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && isLayerVisible(layer, mapLayers)));
}, {});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sYXllci11dGlscy5qcyJdLCJuYW1lcyI6WyJmaW5kRGVmYXVsdExheWVyIiwiZGF0YXNldCIsImxheWVyQ2xhc3NlcyIsImxheWVyUHJvcHMiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwicHJldmlvdXMiLCJsYyIsInJlc3VsdCIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsInByb3BzIiwiQXJyYXkiLCJpc0FycmF5IiwiZm91bmRMYXllcnMiLCJjb25jYXQiLCJtYXAiLCJwIiwidHlwZSIsImRhdGFJZCIsImlkIiwibGF5ZXIiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJkYXRhQ29udGFpbmVyIiwiY2FsY3VsYXRlTGF5ZXJEYXRhIiwic3RhdGUiLCJvbGRMYXllckRhdGEiLCJoYXNBbGxDb2x1bW5zIiwiY29uZmlnIiwibGF5ZXJEYXRhIiwiZm9ybWF0TGF5ZXJEYXRhIiwiZGF0YXNldHMiLCJnZXRMYXllckhvdmVyUHJvcCIsImludGVyYWN0aW9uQ29uZmlnIiwiaG92ZXJJbmZvIiwibGF5ZXJzIiwibGF5ZXJzVG9SZW5kZXIiLCJ0b29sdGlwIiwiZW5hYmxlZCIsInBpY2tlZCIsIm9iamVjdCIsIm92ZXJsYXkiLCJpZHgiLCJnZXRIb3ZlckRhdGEiLCJmaWVsZHMiLCJkYXRhIiwiZmllbGRzVG9TaG93IiwicmVuZGVyRGVja0dsTGF5ZXIiLCJsYXllckNhbGxiYWNrcyIsImNsaWNrZWQiLCJtYXBTdGF0ZSIsImFuaW1hdGlvbkNvbmZpZyIsIm1hcExheWVycyIsImdwdUZpbHRlciIsIm9iamVjdEhvdmVyZWQiLCJ2aXNpYmxlIiwicmVuZGVyTGF5ZXIiLCJpc0xheWVyUmVuZGVyYWJsZSIsIkdFT0NPREVSX0xBWUVSX0lEIiwic2hvdWxkUmVuZGVyTGF5ZXIiLCJpc0xheWVyVmlzaWJsZSIsImlzVmlzaWJsZSIsInByZXBhcmVMYXllcnNGb3JEZWNrIiwiYWNjdSIsIm92ZXJsYXlUeXBlIiwiT1ZFUkxBWV9UWVBF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QUF1Q04sU0FBdkMsRUFBa0R1QixTQUFsRCxFQUE2RDtBQUNsRSxTQUFPakIsTUFBTSxDQUFDN0IsTUFBUCxDQUNMLFVBQUN5RCxJQUFELEVBQU8xQyxLQUFQLEVBQWNxQixHQUFkO0FBQUEsMkNBQ0txQixJQURMLDRDQUVHMUMsS0FBSyxDQUFDRCxFQUZULEVBRWNxQyxpQkFBaUIsQ0FBQ3BDLEtBQUQsRUFBUVEsU0FBUyxDQUFDYSxHQUFELENBQWpCLENBQWpCLElBQTRDa0IsY0FBYyxDQUFDdkMsS0FBRCxFQUFRK0IsU0FBUixDQUZ4RTtBQUFBLEdBREssRUFLTCxFQUxLLENBQVA7QUFPRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7T1ZFUkxBWV9UWVBFfSBmcm9tICdsYXllcnMvYmFzZS1sYXllcic7XG5pbXBvcnQge0dFT0NPREVSX0xBWUVSX0lEfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbi8qKlxuICogRmluZCBkZWZhdWx0IGxheWVycyBmcm9tIGZpZWxkc1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vbGF5ZXItdXRpbHMnKS5maW5kRGVmYXVsdExheWVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZERlZmF1bHRMYXllcihkYXRhc2V0LCBsYXllckNsYXNzZXMpIHtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGxheWVyUHJvcHMgPSBPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpLnJlZHVjZSgocHJldmlvdXMsIGxjKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIHR5cGVvZiBsYXllckNsYXNzZXNbbGNdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGxheWVyQ2xhc3Nlc1tsY10uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIHByZXZpb3VzKVxuICAgICAgICA6IHtwcm9wczogW119O1xuXG4gICAgY29uc3QgcHJvcHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQucHJvcHMgfHwgW107XG4gICAgY29uc3QgZm91bmRMYXllcnMgPSByZXN1bHQuZm91bmRMYXllcnMgfHwgcHJldmlvdXM7XG5cbiAgICByZXR1cm4gZm91bmRMYXllcnMuY29uY2F0KFxuICAgICAgcHJvcHMubWFwKHAgPT4gKHtcbiAgICAgICAgLi4ucCxcbiAgICAgICAgdHlwZTogbGMsXG4gICAgICAgIGRhdGFJZDogZGF0YXNldC5pZFxuICAgICAgfSkpXG4gICAgKTtcbiAgfSwgW10pO1xuXG4gIC8vIGdvIHRocm91Z2ggYWxsIGxheWVyUHJvcHMgdG8gY3JlYXRlIGxheWVyXG4gIHJldHVybiBsYXllclByb3BzLm1hcChwcm9wcyA9PiB7XG4gICAgY29uc3QgbGF5ZXIgPSBuZXcgbGF5ZXJDbGFzc2VzW3Byb3BzLnR5cGVdKHByb3BzKTtcbiAgICByZXR1cm4gdHlwZW9mIGxheWVyLnNldEluaXRpYWxMYXllckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJyAmJiBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAgID8gbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnKGRhdGFzZXQpXG4gICAgICA6IGxheWVyO1xuICB9KTtcbn1cblxuLyoqXG4gKiBjYWxjdWxhdGUgbGF5ZXIgZGF0YSBiYXNlZCBvbiBsYXllciB0eXBlLCBjb2wgQ29uZmlnLFxuICogcmV0dXJuIHVwZGF0ZWQgbGF5ZXIgaWYgY29sb3JEb21haW4sIGRhdGFNYXAgaGFzIGNoYW5nZWRcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCcuL2xheWVyLXV0aWxzJykuY2FsY3VsYXRlTGF5ZXJEYXRhfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTGF5ZXJEYXRhKGxheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKSB7XG4gIGNvbnN0IHt0eXBlfSA9IGxheWVyO1xuXG4gIGlmICghdHlwZSB8fCAhbGF5ZXIuaGFzQWxsQ29sdW1ucygpIHx8ICFsYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgcmV0dXJuIHtsYXllciwgbGF5ZXJEYXRhOiB7fX07XG4gIH1cblxuICBjb25zdCBsYXllckRhdGEgPSBsYXllci5mb3JtYXRMYXllckRhdGEoc3RhdGUuZGF0YXNldHMsIG9sZExheWVyRGF0YSk7XG4gIHJldHVybiB7bGF5ZXJEYXRhLCBsYXllcn07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHByb3BzIHBhc3NlZCB0byBMYXllckhvdmVySW5mb1xuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoJy4vbGF5ZXItdXRpbHMnKS5nZXRMYXllckhvdmVyUHJvcH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheWVySG92ZXJQcm9wKHtcbiAgaW50ZXJhY3Rpb25Db25maWcsXG4gIGhvdmVySW5mbyxcbiAgbGF5ZXJzLFxuICBsYXllcnNUb1JlbmRlcixcbiAgZGF0YXNldHNcbn0pIHtcbiAgaWYgKGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuZW5hYmxlZCAmJiBob3ZlckluZm8gJiYgaG92ZXJJbmZvLnBpY2tlZCkge1xuICAgIC8vIGlmIGFueXRoaW5nIGhvdmVyZWRcbiAgICBjb25zdCB7b2JqZWN0LCBsYXllcjogb3ZlcmxheX0gPSBob3ZlckluZm87XG5cbiAgICAvLyBkZWNrZ2wgbGF5ZXIgdG8ga2VwbGVyLWdsIGxheWVyXG4gICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbb3ZlcmxheS5wcm9wcy5pZHhdO1xuXG4gICAgaWYgKG9iamVjdCAmJiBsYXllciAmJiBsYXllci5nZXRIb3ZlckRhdGEgJiYgbGF5ZXJzVG9SZW5kZXJbbGF5ZXIuaWRdKSB7XG4gICAgICAvLyBpZiBsYXllciBpcyB2aXNpYmxlIGFuZCBoYXZlIGhvdmVyZWQgZGF0YVxuICAgICAgY29uc3Qge1xuICAgICAgICBjb25maWc6IHtkYXRhSWR9XG4gICAgICB9ID0gbGF5ZXI7XG4gICAgICBpZiAoIWRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWVsZHN9ID0gZGF0YXNldHNbZGF0YUlkXTtcbiAgICAgIGNvbnN0IGRhdGEgPSBsYXllci5nZXRIb3ZlckRhdGEob2JqZWN0LCBkYXRhQ29udGFpbmVyLCBmaWVsZHMpO1xuICAgICAgY29uc3QgZmllbGRzVG9TaG93ID0gaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgZmllbGRzVG9TaG93LFxuICAgICAgICBsYXllclxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckRlY2tHbExheWVyKHByb3BzLCBsYXllckNhbGxiYWNrcywgaWR4KSB7XG4gIGNvbnN0IHtcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgbGF5ZXJEYXRhLFxuICAgIGhvdmVySW5mbyxcbiAgICBjbGlja2VkLFxuICAgIG1hcFN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBtYXBMYXllcnNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBsYXllciA9IGxheWVyc1tpZHhdO1xuICBjb25zdCBkYXRhID0gbGF5ZXJEYXRhW2lkeF07XG4gIGNvbnN0IHtncHVGaWx0ZXJ9ID0gZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0gfHwge307XG4gIGNvbnN0IG9iamVjdEhvdmVyZWQgPSBjbGlja2VkIHx8IGhvdmVySW5mbztcbiAgY29uc3QgdmlzaWJsZSA9ICFtYXBMYXllcnMgfHwgKG1hcExheWVycyAmJiBtYXBMYXllcnNbbGF5ZXIuaWRdKTtcbiAgLy8gTGF5ZXIgaXMgTGF5ZXIgY2xhc3NcbiAgcmV0dXJuIGxheWVyLnJlbmRlckxheWVyKHtcbiAgICBkYXRhLFxuICAgIGdwdUZpbHRlcixcbiAgICBpZHgsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgbGF5ZXJDYWxsYmFja3MsXG4gICAgbWFwU3RhdGUsXG4gICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgdmlzaWJsZVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGEpIHtcbiAgcmV0dXJuIGxheWVyLmlkICE9PSBHRU9DT0RFUl9MQVlFUl9JRCAmJiBsYXllci5zaG91bGRSZW5kZXJMYXllcihsYXllckRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycykge1xuICByZXR1cm4gKFxuICAgIGxheWVyLmNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBkb24ndCByZW5kZXIgaXRcbiAgICAoIW1hcExheWVycyB8fCAobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllci5pZF0pKVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiBsYXllcnMgcmVuZGVyZWQgYnkgdGhlIGRlY2suZ2xcbi8vIE5vdGUsIGlzVmlzaWJsZTogZmFsc2UgbGF5ZXIgaXMgcGFzc2VkIHRvIGRlY2suZ2wgaGVyZVxuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNGb3JEZWNrKGxheWVycywgbGF5ZXJEYXRhKSB7XG4gIHJldHVybiBsYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllciwgaWR4KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5pZF06XG4gICAgICAgIGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGFbaWR4XSkgJiYgbGF5ZXIub3ZlcmxheVR5cGUgPT09IE9WRVJMQVlfVFlQRS5kZWNrZ2xcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiByZW5kZXJlZCBsYXllcnMgcmVuZGVyZWQgaW4gdGhlIG1hcFxuLy8gVGhpcyBpbmNsdWRlcyBvbmx5IHRoZSB2aXNpYmlsZSBsYXllcnMgZm9yIHNpbmdsZSBtYXAgdmlldyBhbmQgc3BsaXQgbWFwIHZpZXdcbi8vIHJldHVybiB7W2lkXTogdHJ1ZSBcXCBmYWxzZX1cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGF5ZXJzVG9SZW5kZXIobGF5ZXJzLCBsYXllckRhdGEsIG1hcExheWVycykge1xuICByZXR1cm4gbGF5ZXJzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIsIGlkeCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbbGF5ZXIuaWRdOiBpc0xheWVyUmVuZGVyYWJsZShsYXllciwgbGF5ZXJEYXRhW2lkeF0pICYmIGlzTGF5ZXJWaXNpYmxlKGxheWVyLCBtYXBMYXllcnMpXG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cbiJdfQ==