UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

298 lines (256 loc) 32.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.arctVisConfigs = exports.arcRequiredColumns = exports.arcPosResolver = exports.arcPosAccessor = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _arcBrushingLayer = _interopRequireDefault(require("../../deckgl-layers/arc-brushing-layer/arc-brushing-layer")); var _colorUtils = require("../../utils/color-utils"); var _arcLayerIcon = _interopRequireDefault(require("./arc-layer-icon")); 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; } var arcPosAccessor = function arcPosAccessor(_ref) { var lat0 = _ref.lat0, lng0 = _ref.lng0, lat1 = _ref.lat1, lng1 = _ref.lng1; return function (d) { return [d.data[lng0.fieldIdx], d.data[lat0.fieldIdx], 0, d.data[lng1.fieldIdx], d.data[lat1.fieldIdx], 0]; }; }; exports.arcPosAccessor = arcPosAccessor; var arcPosResolver = function arcPosResolver(_ref2) { var lat0 = _ref2.lat0, lng0 = _ref2.lng0, lat1 = _ref2.lat1, lng1 = _ref2.lng1; return "".concat(lat0.fieldIdx, "-").concat(lng0.fieldIdx, "-").concat(lat1.fieldIdx, "-").concat(lat1.fieldIdx, "}"); }; exports.arcPosResolver = arcPosResolver; var arcRequiredColumns = ['lat0', 'lng0', 'lat1', 'lng1']; exports.arcRequiredColumns = arcRequiredColumns; var arctVisConfigs = { opacity: 'opacity', thickness: 'thickness', colorRange: 'colorRange', sizeRange: 'strokeWidthRange', targetColor: 'targetColor', 'hi-precision': 'hi-precision' }; exports.arctVisConfigs = arctVisConfigs; var ArcLayer = /*#__PURE__*/ function (_Layer) { (0, _inherits2["default"])(ArcLayer, _Layer); function ArcLayer(props) { var _this; (0, _classCallCheck2["default"])(this, ArcLayer); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(ArcLayer).call(this, props)); _this.registerVisConfig(arctVisConfigs); _this.getPosition = (0, _lodash["default"])(arcPosAccessor, arcPosResolver); return _this; } (0, _createClass2["default"])(ArcLayer, [{ key: "formatLayerData", // TODO: fix complexity /* eslint-disable complexity */ value: function formatLayerData(_, allData, filteredIndex, oldLayerData) { var _this2 = this; var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var _this$config = this.config, colorScale = _this$config.colorScale, colorDomain = _this$config.colorDomain, colorField = _this$config.colorField, color = _this$config.color, columns = _this$config.columns, sizeField = _this$config.sizeField, sizeScale = _this$config.sizeScale, sizeDomain = _this$config.sizeDomain, _this$config$visConfi = _this$config.visConfig, sizeRange = _this$config$visConfi.sizeRange, colorRange = _this$config$visConfi.colorRange, targetColor = _this$config$visConfi.targetColor; // arc color var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // arc thickness var sScale = sizeField && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange); var getPosition = this.getPosition(columns); if (!oldLayerData || oldLayerData.getPosition !== getPosition) { this.updateLayerMeta(allData, getPosition); } var data; if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getPosition === getPosition) { data = oldLayerData.data; } else { data = filteredIndex.reduce(function (accu, index) { var pos = getPosition({ data: allData[index] }); // if doesn't have point lat or lng, do not add the arc // deck.gl can't handle position == null if (!pos.every(Number.isFinite)) { return accu; } accu.push({ index: index, sourcePosition: [pos[0], pos[1], pos[2]], targetPosition: [pos[3], pos[4], pos[5]], data: allData[index] }); return accu; }, []); } var getStrokeWidth = sScale ? function (d) { return _this2.getEncodedChannelValue(sScale, d.data, sizeField, 0); } : 1; var getColor = cScale ? function (d) { return _this2.getEncodedChannelValue(cScale, d.data, colorField); } : color; var getTargetColor = cScale ? function (d) { return _this2.getEncodedChannelValue(cScale, d.data, colorField); } : targetColor || color; return { data: data, getColor: getColor, getSourceColor: getColor, getTargetColor: getTargetColor, getStrokeWidth: getStrokeWidth }; } /* eslint-enable complexity */ }, { key: "updateLayerMeta", value: function updateLayerMeta(allData, getPosition) { // get bounds from arcs var sBounds = this.getPointsBounds(allData, function (d) { var pos = getPosition({ data: d }); return [pos[0], pos[1]]; }); var tBounds = this.getPointsBounds(allData, function (d) { var pos = getPosition({ data: d }); return [pos[3], pos[4]]; }); var bounds = tBounds && sBounds ? [Math.min(sBounds[0], tBounds[0]), Math.min(sBounds[1], tBounds[1]), Math.max(sBounds[2], tBounds[2]), Math.max(sBounds[3], tBounds[3])] : sBounds || tBounds; this.updateMeta({ bounds: bounds }); } }, { key: "renderLayer", value: function renderLayer(_ref3) { var data = _ref3.data, idx = _ref3.idx, objectHovered = _ref3.objectHovered, layerInteraction = _ref3.layerInteraction, mapState = _ref3.mapState, interactionConfig = _ref3.interactionConfig; var brush = interactionConfig.brush; var colorUpdateTriggers = { color: this.config.color, colorField: this.config.colorField, colorRange: this.config.visConfig.colorRange, colorScale: this.config.colorScale, targetColor: this.config.visConfig.targetColor }; var interaction = { // auto highlighting pickable: true, autoHighlight: !brush.enabled, highlightColor: this.config.highlightColor, // brushing brushRadius: brush.config.size * 1000, brushSource: true, brushTarget: true, enableBrushing: brush.enabled }; return [new _arcBrushingLayer["default"](_objectSpread({}, data, {}, interaction, {}, layerInteraction, { id: this.id, idx: idx, fp64: this.config.visConfig['hi-precision'], opacity: this.config.visConfig.opacity, pickedColor: this.config.highlightColor, strokeScale: this.config.visConfig.thickness, // parameters parameters: { depthTest: mapState.dragRotate }, updateTriggers: { getStrokeWidth: { sizeField: this.config.sizeField, sizeRange: this.config.visConfig.sizeRange }, getSourceColor: colorUpdateTriggers, getTargetColor: colorUpdateTriggers } }))]; } }, { key: "type", get: function get() { return 'arc'; } }, { key: "isAggregated", get: function get() { return false; } }, { key: "layerIcon", get: function get() { return _arcLayerIcon["default"]; } }, { key: "requiredLayerColumns", get: function get() { return arcRequiredColumns; } }, { key: "columnPairs", get: function get() { return this.defaultLinkColumnPairs; } }, { key: "visualChannels", get: function get() { return _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(ArcLayer.prototype), "visualChannels", this), { size: _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(ArcLayer.prototype), "visualChannels", this).size, { property: 'stroke' }) }); } }], [{ key: "findDefaultLayerProps", value: function findDefaultLayerProps(_ref4) { var _ref4$fieldPairs = _ref4.fieldPairs, fieldPairs = _ref4$fieldPairs === void 0 ? [] : _ref4$fieldPairs; if (fieldPairs.length < 2) { return []; } var props = { color: (0, _colorUtils.hexToRgb)(_defaultSettings.DEFAULT_LAYER_COLOR.tripArc) }; // connect the first two point layer with arc props.columns = { lat0: fieldPairs[0].pair.lat, lng0: fieldPairs[0].pair.lng, lat1: fieldPairs[1].pair.lat, lng1: fieldPairs[1].pair.lng }; props.label = "".concat(fieldPairs[0].defaultName, " -> ").concat(fieldPairs[1].defaultName, " arc"); return props; } }]); return ArcLayer; }(_baseLayer["default"]); exports["default"] = ArcLayer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYXJjLWxheWVyL2FyYy1sYXllci5qcyJdLCJuYW1lcyI6WyJhcmNQb3NBY2Nlc3NvciIsImxhdDAiLCJsbmcwIiwibGF0MSIsImxuZzEiLCJkIiwiZGF0YSIsImZpZWxkSWR4IiwiYXJjUG9zUmVzb2x2ZXIiLCJhcmNSZXF1aXJlZENvbHVtbnMiLCJhcmN0VmlzQ29uZmlncyIsIm9wYWNpdHkiLCJ0aGlja25lc3MiLCJjb2xvclJhbmdlIiwic2l6ZVJhbmdlIiwidGFyZ2V0Q29sb3IiLCJBcmNMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbiIsIl8iLCJhbGxEYXRhIiwiZmlsdGVyZWRJbmRleCIsIm9sZExheWVyRGF0YSIsIm9wdCIsImNvbmZpZyIsImNvbG9yU2NhbGUiLCJjb2xvckRvbWFpbiIsImNvbG9yRmllbGQiLCJjb2xvciIsImNvbHVtbnMiLCJzaXplRmllbGQiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwidmlzQ29uZmlnIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwiY29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJzU2NhbGUiLCJ1cGRhdGVMYXllck1ldGEiLCJzYW1lRGF0YSIsInJlZHVjZSIsImFjY3UiLCJpbmRleCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwic291cmNlUG9zaXRpb24iLCJ0YXJnZXRQb3NpdGlvbiIsImdldFN0cm9rZVdpZHRoIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImdldENvbG9yIiwiZ2V0VGFyZ2V0Q29sb3IiLCJnZXRTb3VyY2VDb2xvciIsInNCb3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJ0Qm91bmRzIiwiYm91bmRzIiwiTWF0aCIsIm1pbiIsIm1heCIsInVwZGF0ZU1ldGEiLCJpZHgiLCJvYmplY3RIb3ZlcmVkIiwibGF5ZXJJbnRlcmFjdGlvbiIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJicnVzaCIsImNvbG9yVXBkYXRlVHJpZ2dlcnMiLCJpbnRlcmFjdGlvbiIsInBpY2thYmxlIiwiYXV0b0hpZ2hsaWdodCIsImVuYWJsZWQiLCJoaWdobGlnaHRDb2xvciIsImJydXNoUmFkaXVzIiwic2l6ZSIsImJydXNoU291cmNlIiwiYnJ1c2hUYXJnZXQiLCJlbmFibGVCcnVzaGluZyIsIkFyY0JydXNoaW5nTGF5ZXIiLCJpZCIsImZwNjQiLCJwaWNrZWRDb2xvciIsInN0cm9rZVNjYWxlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJ1cGRhdGVUcmlnZ2VycyIsIkFyY0xheWVySWNvbiIsImRlZmF1bHRMaW5rQ29sdW1uUGFpcnMiLCJwcm9wZXJ0eSIsImZpZWxkUGFpcnMiLCJsZW5ndGgiLCJERUZBVUxUX0xBWUVSX0NPTE9SIiwidHJpcEFyYyIsInBhaXIiLCJsYXQiLCJsbmciLCJsYWJlbCIsImRlZmF1bHROYW1lIiwiTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFTyxJQUFNQSxjQUFjLEdBQUcsU0FBakJBLGNBQWlCO0FBQUEsTUFBRUMsSUFBRixRQUFFQSxJQUFGO0FBQUEsTUFBUUMsSUFBUixRQUFRQSxJQUFSO0FBQUEsTUFBY0MsSUFBZCxRQUFjQSxJQUFkO0FBQUEsTUFBb0JDLElBQXBCLFFBQW9CQSxJQUFwQjtBQUFBLFNBQThCLFVBQUFDLENBQUM7QUFBQSxXQUFJLENBQy9EQSxDQUFDLENBQUNDLElBQUYsQ0FBT0osSUFBSSxDQUFDSyxRQUFaLENBRCtELEVBRS9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0wsSUFBSSxDQUFDTSxRQUFaLENBRitELEVBRy9ELENBSCtELEVBSS9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0YsSUFBSSxDQUFDRyxRQUFaLENBSitELEVBSy9ERixDQUFDLENBQUNDLElBQUYsQ0FBT0gsSUFBSSxD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SSxJQUFkLENBQW1CRTtBQUpYLE9BQWhCO0FBTUFwRixNQUFBQSxLQUFLLENBQUNxRixLQUFOLGFBQWlCUCxVQUFVLENBQUMsQ0FBRCxDQUFWLENBQWNRLFdBQS9CLGlCQUNFUixVQUFVLENBQUMsQ0FBRCxDQUFWLENBQWNRLFdBRGhCO0FBSUEsYUFBT3RGLEtBQVA7QUFDRDs7O0VBekRtQ3VGLHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoLm1lbW9pemUnO1xuXG5pbXBvcnQgTGF5ZXIgZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQgQXJjQnJ1c2hpbmdMYXllciBmcm9tICdkZWNrZ2wtbGF5ZXJzL2FyYy1icnVzaGluZy1sYXllci9hcmMtYnJ1c2hpbmctbGF5ZXInO1xuaW1wb3J0IHtoZXhUb1JnYn0gZnJvbSAndXRpbHMvY29sb3ItdXRpbHMnO1xuaW1wb3J0IEFyY0xheWVySWNvbiBmcm9tICcuL2FyYy1sYXllci1pY29uJztcbmltcG9ydCB7REVGQVVMVF9MQVlFUl9DT0xPUn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5leHBvcnQgY29uc3QgYXJjUG9zQWNjZXNzb3IgPSAoe2xhdDAsIGxuZzAsIGxhdDEsIGxuZzF9KSA9PiBkID0+IFtcbiAgZC5kYXRhW2xuZzAuZmllbGRJZHhdLFxuICBkLmRhdGFbbGF0MC5maWVsZElkeF0sXG4gIDAsXG4gIGQuZGF0YVtsbmcxLmZpZWxkSWR4XSxcbiAgZC5kYXRhW2xhdDEuZmllbGRJZHhdLFxuICAwXG5dO1xuXG5leHBvcnQgY29uc3QgYXJjUG9zUmVzb2x2ZXIgPSAoe2xhdDAsIGxuZzAsIGxhdDEsIGxuZzF9KSA9PlxuICBgJHtsYXQwLmZpZWxkSWR4fS0ke2xuZzAuZmllbGRJZHh9LSR7bGF0MS5maWVsZElkeH0tJHtsYXQxLmZpZWxkSWR4fX1gO1xuXG5leHBvcnQgY29uc3QgYXJjUmVxdWlyZWRDb2x1bW5zID0gWydsYXQwJywgJ2xuZzAnLCAnbGF0MScsICdsbmcxJ107XG5cbmV4cG9ydCBjb25zdCBhcmN0VmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICB0aGlja25lc3M6ICd0aGlja25lc3MnLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnLFxuICB0YXJnZXRDb2xvcjogJ3RhcmdldENvbG9yJyxcbiAgJ2hpLXByZWNpc2lvbic6ICdoaS1wcmVjaXNpb24nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcmNMYXllciBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhhcmN0VmlzQ29uZmlncyk7XG4gICAgdGhpcy5nZXRQb3NpdGlvbiA9IG1lbW9pemUoYXJjUG9zQWNjZXNzb3IsIGFyY1Bvc1Jlc29sdmVyKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnYXJjJztcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gQXJjTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBhcmNSZXF1aXJlZENvbHVtbnM7XG4gIH1cblxuICBnZXQgY29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExpbmtDb2x1bW5QYWlycztcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMsXG4gICAgICBzaXplOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLnNpemUsXG4gICAgICAgIHByb3BlcnR5OiAnc3Ryb2tlJ1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKHtmaWVsZFBhaXJzID0gW119KSB7XG4gICAgaWYgKGZpZWxkUGFpcnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIGNvbG9yOiBoZXhUb1JnYihERUZBVUxUX0xBWUVSX0NPTE9SLnRyaXBBcmMpXG4gICAgfTtcblxuICAgIC8vIGNvbm5lY3QgdGhlIGZpcnN0IHR3byBwb2ludCBsYXllciB3aXRoIGFyY1xuICAgIHByb3BzLmNvbHVtbnMgPSB7XG4gICAgICBsYXQwOiBmaWVsZFBhaXJzWzBdLnBhaXIubGF0LFxuICAgICAgbG5nMDogZmllbGRQYWlyc1swXS5wYWlyLmxuZyxcbiAgICAgIGxhdDE6IGZpZWxkUGFpcnNbMV0ucGFpci5sYXQsXG4gICAgICBsbmcxOiBmaWVsZFBhaXJzWzFdLnBhaXIubG5nXG4gICAgfTtcbiAgICBwcm9wcy5sYWJlbCA9IGAke2ZpZWxkUGFpcnNbMF0uZGVmYXVsdE5hbWV9IC0+ICR7XG4gICAgICBmaWVsZFBhaXJzWzFdLmRlZmF1bHROYW1lXG4gICAgfSBhcmNgO1xuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgLy8gVE9ETzogZml4IGNvbXBsZXhpdHlcbiAgLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuICBmb3JtYXRMYXllckRhdGEoXywgYWxsRGF0YSwgZmlsdGVyZWRJbmRleCwgb2xkTGF5ZXJEYXRhLCBvcHQgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbG9yU2NhbGUsXG4gICAgICBjb2xvckRvbWFpbixcbiAgICAgIGNvbG9yRmllbGQsXG4gICAgICBjb2xvcixcbiAgICAgIGNvbHVtbnMsXG4gICAgICBzaXplRmllbGQsXG4gICAgICBzaXplU2NhbGUsXG4gICAgICBzaXplRG9tYWluLFxuICAgICAgdmlzQ29uZmlnOiB7c2l6ZVJhbmdlLCBjb2xvclJhbmdlLCB0YXJnZXRDb2xvcn1cbiAgICB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAvLyBhcmMgY29sb3JcbiAgICBjb25zdCBjU2NhbGUgPVxuICAgICAgY29sb3JGaWVsZCAmJlxuICAgICAgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoXG4gICAgICAgIGNvbG9yU2NhbGUsXG4gICAgICAgIGNvbG9yRG9tYWluLFxuICAgICAgICBjb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpXG4gICAgICApO1xuXG4gICAgLy8gYXJjIHRoaWNrbmVzc1xuICAgIGNvbnN0IHNTY2FsZSA9XG4gICAgICBzaXplRmllbGQgJiYgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoc2l6ZVNjYWxlLCBzaXplRG9tYWluLCBzaXplUmFuZ2UpO1xuXG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKGNvbHVtbnMpO1xuXG4gICAgaWYgKCFvbGRMYXllckRhdGEgfHwgb2xkTGF5ZXJEYXRhLmdldFBvc2l0aW9uICE9PSBnZXRQb3NpdGlvbikge1xuICAgICAgdGhpcy51cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIGxldCBkYXRhO1xuICAgIGlmIChcbiAgICAgIG9sZExheWVyRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmRhdGEgJiZcbiAgICAgIG9wdC5zYW1lRGF0YSAmJlxuICAgICAgb2xkTGF5ZXJEYXRhLmdldFBvc2l0aW9uID09PSBnZXRQb3NpdGlvblxuICAgICkge1xuICAgICAgZGF0YSA9IG9sZExheWVyRGF0YS5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gZmlsdGVyZWRJbmRleC5yZWR1Y2UoKGFjY3UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtkYXRhOiBhbGxEYXRhW2luZGV4XX0pO1xuXG4gICAgICAgIC8vIGlmIGRvZXNuJ3QgaGF2ZSBwb2ludCBsYXQgb3IgbG5nLCBkbyBub3QgYWRkIHRoZSBhcmNcbiAgICAgICAgLy8gZGVjay5nbCBjYW4ndCBoYW5kbGUgcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICBpZiAoIXBvcy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1LnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHNvdXJjZVBvc2l0aW9uOiBbcG9zWzBdLCBwb3NbMV0sIHBvc1syXV0sXG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb246IFtwb3NbM10sIHBvc1s0XSwgcG9zWzVdXSxcbiAgICAgICAgICBkYXRhOiBhbGxEYXRhW2luZGV4XVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWNjdTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRTdHJva2VXaWR0aCA9IHNTY2FsZSA/IGQgPT5cbiAgICAgICB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoc1NjYWxlLCBkLmRhdGEsIHNpemVGaWVsZCwgMCkgOiAxO1xuXG4gICAgY29uc3QgZ2V0Q29sb3IgPSBjU2NhbGUgPyBkID0+XG4gICAgICAgdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKGNTY2FsZSwgZC5kYXRhLCBjb2xvckZpZWxkKSA6IGNvbG9yO1xuXG4gICAgY29uc3QgZ2V0VGFyZ2V0Q29sb3IgPSBjU2NhbGUgPyBkID0+XG4gICAgICAgdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKGNTY2FsZSwgZC5kYXRhLCBjb2xvckZpZWxkKVxuICAgICAgICA6IHRhcmdldENvbG9yIHx8IGNvbG9yO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBnZXRDb2xvcixcbiAgICAgIGdldFNvdXJjZUNvbG9yOiBnZXRDb2xvcixcbiAgICAgIGdldFRhcmdldENvbG9yLFxuICAgICAgZ2V0U3Ryb2tlV2lkdGhcbiAgICB9O1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG4gIHVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGdldCBib3VuZHMgZnJvbSBhcmNzXG4gICAgY29uc3Qgc0JvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGFsbERhdGEsIGQgPT4ge1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2RhdGE6IGR9KTtcbiAgICAgIHJldHVybiBbcG9zWzBdLCBwb3NbMV1dO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdEJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGFsbERhdGEsIGQgPT4ge1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2RhdGE6IGR9KTtcbiAgICAgIHJldHVybiBbcG9zWzNdLCBwb3NbNF1dO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYm91bmRzID1cbiAgICAgIHRCb3VuZHMgJiYgc0JvdW5kc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIE1hdGgubWluKHNCb3VuZHNbMF0sIHRCb3VuZHNbMF0pLFxuICAgICAgICAgICAgTWF0aC5taW4oc0JvdW5kc1sxXSwgdEJvdW5kc1sxXSksXG4gICAgICAgICAgICBNYXRoLm1heChzQm91bmRzWzJdLCB0Qm91bmRzWzJdKSxcbiAgICAgICAgICAgIE1hdGgubWF4KHNCb3VuZHNbM10sIHRCb3VuZHNbM10pXG4gICAgICAgICAgXVxuICAgICAgICA6IHNCb3VuZHMgfHwgdEJvdW5kcztcblxuICAgIHRoaXMudXBkYXRlTWV0YSh7Ym91bmRzfSk7XG4gIH1cblxuICByZW5kZXJMYXllcih7XG4gICAgZGF0YSxcbiAgICBpZHgsXG4gICAgb2JqZWN0SG92ZXJlZCxcbiAgICBsYXllckludGVyYWN0aW9uLFxuICAgIG1hcFN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH0pIHtcbiAgICBjb25zdCB7YnJ1c2h9ID0gaW50ZXJhY3Rpb25Db25maWc7XG5cbiAgICBjb25zdCBjb2xvclVwZGF0ZVRyaWdnZXJzID0ge1xuICAgICAgY29sb3I6IHRoaXMuY29uZmlnLmNvbG9yLFxuICAgICAgY29sb3JGaWVsZDogdGhpcy5jb25maWcuY29sb3JGaWVsZCxcbiAgICAgIGNvbG9yUmFuZ2U6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5jb2xvclJhbmdlLFxuICAgICAgY29sb3JTY2FsZTogdGhpcy5jb25maWcuY29sb3JTY2FsZSxcbiAgICAgIHRhcmdldENvbG9yOiB0aGlzLmNvbmZpZy52aXNDb25maWcudGFyZ2V0Q29sb3JcbiAgICB9O1xuXG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAvLyBhdXRvIGhpZ2hsaWdodGluZ1xuICAgICAgcGlja2FibGU6IHRydWUsXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcblxuICAgICAgLy8gYnJ1c2hpbmdcbiAgICAgIGJydXNoUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaFNvdXJjZTogdHJ1ZSxcbiAgICAgIGJydXNoVGFyZ2V0OiB0cnVlLFxuICAgICAgZW5hYmxlQnJ1c2hpbmc6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBBcmNCcnVzaGluZ0xheWVyKHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uaW50ZXJhY3Rpb24sXG4gICAgICAgIC4uLmxheWVySW50ZXJhY3Rpb24sXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBpZHgsXG4gICAgICAgIGZwNjQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1snaGktcHJlY2lzaW9uJ10sXG4gICAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuICAgICAgICBwaWNrZWRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgIHN0cm9rZVNjYWxlOiB0aGlzLmNvbmZpZy52aXNDb25maWcudGhpY2tuZXNzLFxuXG4gICAgICAgIC8vIHBhcmFtZXRlcnNcbiAgICAgICAgcGFyYW1ldGVyczoge2RlcHRoVGVzdDogbWFwU3RhdGUuZHJhZ1JvdGF0ZX0sXG5cbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICBnZXRTdHJva2VXaWR0aDoge1xuICAgICAgICAgICAgc2l6ZUZpZWxkOiB0aGlzLmNvbmZpZy5zaXplRmllbGQsXG4gICAgICAgICAgICBzaXplUmFuZ2U6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5zaXplUmFuZ2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFNvdXJjZUNvbG9yOiBjb2xvclVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgIGdldFRhcmdldENvbG9yOiBjb2xvclVwZGF0ZVRyaWdnZXJzXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXTtcbiAgfVxufVxuIl19