kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
328 lines (266 loc) • 30.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.arctVisConfigs = exports.arcRequiredColumns = exports.arcPosResolver = exports.arcPosAccessor = undefined;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _get2 = require('babel-runtime/helpers/get');
var _get3 = _interopRequireDefault(_get2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _lodash = require('lodash.memoize');
var _lodash2 = _interopRequireDefault(_lodash);
var _baseLayer = require('../base-layer');
var _baseLayer2 = _interopRequireDefault(_baseLayer);
var _arcBrushingLayer = require('../../deckgl-layers/arc-brushing-layer/arc-brushing-layer');
var _arcBrushingLayer2 = _interopRequireDefault(_arcBrushingLayer);
var _colorUtils = require('../../utils/color-utils');
var _arcLayerIcon = require('./arc-layer-icon');
var _arcLayerIcon2 = _interopRequireDefault(_arcLayerIcon);
var _defaultSettings = require('../../constants/default-settings');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
var arcPosAccessor = exports.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];
};
};
var arcPosResolver = exports.arcPosResolver = function arcPosResolver(_ref2) {
var lat0 = _ref2.lat0,
lng0 = _ref2.lng0,
lat1 = _ref2.lat1,
lng1 = _ref2.lng1;
return lat0.fieldIdx + '-' + lng0.fieldIdx + '-' + lat1.fieldIdx + '-' + lat1.fieldIdx + '}';
};
var arcRequiredColumns = exports.arcRequiredColumns = ['lat0', 'lng0', 'lat1', 'lng1'];
var arctVisConfigs = exports.arctVisConfigs = {
opacity: 'opacity',
thickness: 'thickness',
colorRange: 'colorRange',
sizeRange: 'strokeWidthRange',
targetColor: 'targetColor',
'hi-precision': 'hi-precision'
};
var ArcLayer = function (_Layer) {
(0, _inherits3.default)(ArcLayer, _Layer);
function ArcLayer(props) {
(0, _classCallCheck3.default)(this, ArcLayer);
var _this = (0, _possibleConstructorReturn3.default)(this, (ArcLayer.__proto__ || Object.getPrototypeOf(ArcLayer)).call(this, props));
_this.registerVisConfig(arctVisConfigs);
_this.getPosition = (0, _lodash2.default)(arcPosAccessor, arcPosResolver);
return _this;
}
(0, _createClass3.default)(ArcLayer, [{
key: 'formatLayerData',
value: function formatLayerData(_, allData, filteredIndex, oldLayerData) {
var _this2 = this;
var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var _config = this.config,
colorScale = _config.colorScale,
colorDomain = _config.colorDomain,
colorField = _config.colorField,
color = _config.color,
columns = _config.columns,
sizeField = _config.sizeField,
sizeScale = _config.sizeScale,
sizeDomain = _config.sizeDomain,
_config$visConfig = _config.visConfig,
sizeRange = _config$visConfig.sizeRange,
colorRange = _config$visConfig.colorRange,
targetColor = _config$visConfig.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 = void 0;
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
};
}
}, {
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 = [Math.min(sBounds[0], tBounds[0]), Math.min(sBounds[1], tBounds[1]), Math.max(sBounds[2], tBounds[2]), Math.max(sBounds[3], tBounds[3])];
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 _arcBrushingLayer2.default((0, _extends3.default)({}, 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 _arcLayerIcon2.default;
}
}, {
key: 'requiredLayerColumns',
get: function get() {
return arcRequiredColumns;
}
}, {
key: 'columnPairs',
get: function get() {
return this.defaultLinkColumnPairs;
}
}, {
key: 'visualChannels',
get: function get() {
return (0, _extends3.default)({}, (0, _get3.default)(ArcLayer.prototype.__proto__ || Object.getPrototypeOf(ArcLayer.prototype), 'visualChannels', this), {
size: (0, _extends3.default)({}, (0, _get3.default)(ArcLayer.prototype.__proto__ || Object.getPrototypeOf(ArcLayer.prototype), 'visualChannels', this).size, {
property: 'stroke'
})
});
}
}], [{
key: 'findDefaultLayerProps',
value: function findDefaultLayerProps(_ref4) {
var _ref4$fieldPairs = _ref4.fieldPairs,
fieldPairs = _ref4$fieldPairs === undefined ? [] : _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 = fieldPairs[0].defaultName + ' -> ' + fieldPairs[1].defaultName + ' arc';
return props;
}
}]);
return ArcLayer;
}(_baseLayer2.default);
exports.default = ArcLayer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYXJjLWxheWVyL2FyYy1sYXllci5qcyJdLCJuYW1lcyI6WyJhcmNQb3NBY2Nlc3NvciIsImxhdDAiLCJsbmcwIiwibGF0MSIsImxuZzEiLCJkIiwiZGF0YSIsImZpZWxkSWR4IiwiYXJjUG9zUmVzb2x2ZXIiLCJhcmNSZXF1aXJlZENvbHVtbnMiLCJhcmN0VmlzQ29uZmlncyIsIm9wYWNpdHkiLCJ0aGlja25lc3MiLCJjb2xvclJhbmdlIiwic2l6ZVJhbmdlIiwidGFyZ2V0Q29sb3IiLCJBcmNMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbiIsIl8iLCJhbGxEYXRhIiwiZmlsdGVyZWRJbmRleCIsIm9sZExheWVyRGF0YSIsIm9wdCIsImNvbmZpZyIsImNvbG9yU2NhbGUiLCJjb2xvckRvbWFpbiIsImNvbG9yRmllbGQiLCJjb2xvciIsImNvbHVtbnMiLCJzaXplRmllbGQiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwidmlzQ29uZmlnIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwiY29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJzU2NhbGUiLCJ1cGRhdGVMYXllck1ldGEiLCJzYW1lRGF0YSIsInJlZHVjZSIsImFjY3UiLCJpbmRleCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwic291cmNlUG9zaXRpb24iLCJ0YXJnZXRQb3NpdGlvbiIsImdldFN0cm9rZVdpZHRoIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImdldENvbG9yIiwiZ2V0VGFyZ2V0Q29sb3IiLCJnZXRTb3VyY2VDb2xvciIsInNCb3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJ0Qm91bmRzIiwiYm91bmRzIiwiTWF0aCIsIm1pbiIsIm1heCIsInVwZGF0ZU1ldGEiLCJpZHgiLCJvYmplY3RIb3ZlcmVkIiwibGF5ZXJJbnRlcmFjdGlvbiIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJicnVzaCIsImNvbG9yVXBkYXRlVHJpZ2dlcnMiLCJpbnRlcmFjdGlvbiIsInBpY2thYmxlIiwiYXV0b0hpZ2hsaWdodCIsImVuYWJsZWQiLCJoaWdobGlnaHRDb2xvciIsImJydXNoUmFkaXVzIiwic2l6ZSIsImJydXNoU291cmNlIiwiYnJ1c2hUYXJnZXQiLCJlbmFibGVCcnVzaGluZyIsIkFyY0JydXNoaW5nTGF5ZXIiLCJpZCIsImZwNjQiLCJwaWNrZWRDb2xvciIsInN0cm9rZVNjYWxlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJ1cGRhdGVUcmlnZ2VycyIsIkFyY0xheWVySWNvbiIsImRlZmF1bHRMaW5rQ29sdW1uUGFpcnMiLCJwcm9wZXJ0eSIsImZpZWxkUGFpcnMiLCJsZW5ndGgiLCJERUZBVUxUX0xBWUVSX0NPTE9SIiwidHJpcEFyYyIsInBhaXIiLCJsYXQiLCJsbmciLCJsYWJlbCIsImRlZmF1bHROYW1lIiwiTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQTFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFVTyxJQUFNQSwwQ0FBaUIsU0FBakJBLGNBQWlCO0FBQUEsTUFBRUMsSUFBRixRQUFFQSxJQUFGO0FBQUEsTUFBUUMsSUFBUixRQUFRQSxJQUFSO0FBQUEsTUFBY0MsSUFBZCxRQUFjQSxJQUFkO0FBQUEsTUFBb0JDLElBQXBCLFFBQW9CQSxJQUFwQjtBQUFBLFNBQThCO0FBQUEsV0FBSyxDQUMvREMsRUFBRUMsSUFBRixDQUFPSixLQUFLSyxRQUFaLENBRCtELEVBRS9ERixFQUFFQyxJQUFGLENBQU9MLEtBQUtNLFFBQVosQ0FGK0QsRUFHL0QsQ0FIK0QsRUFJL0RGLEVB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aG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoLm1lbW9pemUnO1xuXG5pbXBvcnQgTGF5ZXIgZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQgQXJjQnJ1c2hpbmdMYXllciBmcm9tICdkZWNrZ2wtbGF5ZXJzL2FyYy1icnVzaGluZy1sYXllci9hcmMtYnJ1c2hpbmctbGF5ZXInO1xuaW1wb3J0IHtoZXhUb1JnYn0gZnJvbSAndXRpbHMvY29sb3ItdXRpbHMnO1xuaW1wb3J0IEFyY0xheWVySWNvbiBmcm9tICcuL2FyYy1sYXllci1pY29uJztcbmltcG9ydCB7REVGQVVMVF9MQVlFUl9DT0xPUn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5leHBvcnQgY29uc3QgYXJjUG9zQWNjZXNzb3IgPSAoe2xhdDAsIGxuZzAsIGxhdDEsIGxuZzF9KSA9PiBkID0+IFtcbiAgZC5kYXRhW2xuZzAuZmllbGRJZHhdLFxuICBkLmRhdGFbbGF0MC5maWVsZElkeF0sXG4gIDAsXG4gIGQuZGF0YVtsbmcxLmZpZWxkSWR4XSxcbiAgZC5kYXRhW2xhdDEuZmllbGRJZHhdLFxuICAwXG5dO1xuXG5leHBvcnQgY29uc3QgYXJjUG9zUmVzb2x2ZXIgPSAoe2xhdDAsIGxuZzAsIGxhdDEsIGxuZzF9KSA9PlxuICBgJHtsYXQwLmZpZWxkSWR4fS0ke2xuZzAuZmllbGRJZHh9LSR7bGF0MS5maWVsZElkeH0tJHtsYXQxLmZpZWxkSWR4fX1gO1xuXG5leHBvcnQgY29uc3QgYXJjUmVxdWlyZWRDb2x1bW5zID0gWydsYXQwJywgJ2xuZzAnLCAnbGF0MScsICdsbmcxJ107XG5cbmV4cG9ydCBjb25zdCBhcmN0VmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICB0aGlja25lc3M6ICd0aGlja25lc3MnLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnLFxuICB0YXJnZXRDb2xvcjogJ3RhcmdldENvbG9yJyxcbiAgJ2hpLXByZWNpc2lvbic6ICdoaS1wcmVjaXNpb24nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcmNMYXllciBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhhcmN0VmlzQ29uZmlncyk7XG4gICAgdGhpcy5nZXRQb3NpdGlvbiA9IG1lbW9pemUoYXJjUG9zQWNjZXNzb3IsIGFyY1Bvc1Jlc29sdmVyKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnYXJjJztcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gQXJjTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBhcmNSZXF1aXJlZENvbHVtbnM7XG4gIH1cblxuICBnZXQgY29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExpbmtDb2x1bW5QYWlycztcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMsXG4gICAgICBzaXplOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLnNpemUsXG4gICAgICAgIHByb3BlcnR5OiAnc3Ryb2tlJ1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKHtmaWVsZFBhaXJzID0gW119KSB7XG4gICAgaWYgKGZpZWxkUGFpcnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIGNvbG9yOiBoZXhUb1JnYihERUZBVUxUX0xBWUVSX0NPTE9SLnRyaXBBcmMpXG4gICAgfTtcblxuICAgIC8vIGNvbm5lY3QgdGhlIGZpcnN0IHR3byBwb2ludCBsYXllciB3aXRoIGFyY1xuICAgIHByb3BzLmNvbHVtbnMgPSB7XG4gICAgICBsYXQwOiBmaWVsZFBhaXJzWzBdLnBhaXIubGF0LFxuICAgICAgbG5nMDogZmllbGRQYWlyc1swXS5wYWlyLmxuZyxcbiAgICAgIGxhdDE6IGZpZWxkUGFpcnNbMV0ucGFpci5sYXQsXG4gICAgICBsbmcxOiBmaWVsZFBhaXJzWzFdLnBhaXIubG5nXG4gICAgfTtcbiAgICBwcm9wcy5sYWJlbCA9IGAke2ZpZWxkUGFpcnNbMF0uZGVmYXVsdE5hbWV9IC0+ICR7XG4gICAgICBmaWVsZFBhaXJzWzFdLmRlZmF1bHROYW1lXG4gICAgfSBhcmNgO1xuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgZm9ybWF0TGF5ZXJEYXRhKF8sIGFsbERhdGEsIGZpbHRlcmVkSW5kZXgsIG9sZExheWVyRGF0YSwgb3B0ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xvclNjYWxlLFxuICAgICAgY29sb3JEb21haW4sXG4gICAgICBjb2xvckZpZWxkLFxuICAgICAgY29sb3IsXG4gICAgICBjb2x1bW5zLFxuICAgICAgc2l6ZUZpZWxkLFxuICAgICAgc2l6ZVNjYWxlLFxuICAgICAgc2l6ZURvbWFpbixcbiAgICAgIHZpc0NvbmZpZzoge3NpemVSYW5nZSwgY29sb3JSYW5nZSwgdGFyZ2V0Q29sb3J9XG4gICAgfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgLy8gYXJjIGNvbG9yXG4gICAgY29uc3QgY1NjYWxlID1cbiAgICAgIGNvbG9yRmllbGQgJiZcbiAgICAgIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAgICAgICBjb2xvclNjYWxlLFxuICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKVxuICAgICAgKTtcblxuICAgIC8vIGFyYyB0aGlja25lc3NcbiAgICBjb25zdCBzU2NhbGUgPVxuICAgICAgc2l6ZUZpZWxkICYmIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKHNpemVTY2FsZSwgc2l6ZURvbWFpbiwgc2l6ZVJhbmdlKTtcblxuICAgIGNvbnN0IGdldFBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihjb2x1bW5zKTtcblxuICAgIGlmICghb2xkTGF5ZXJEYXRhIHx8IG9sZExheWVyRGF0YS5nZXRQb3NpdGlvbiAhPT0gZ2V0UG9zaXRpb24pIHtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJNZXRhKGFsbERhdGEsIGdldFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YTtcbiAgICBpZiAoXG4gICAgICBvbGRMYXllckRhdGEgJiZcbiAgICAgIG9sZExheWVyRGF0YS5kYXRhICYmXG4gICAgICBvcHQuc2FtZURhdGEgJiZcbiAgICAgIG9sZExheWVyRGF0YS5nZXRQb3NpdGlvbiA9PT0gZ2V0UG9zaXRpb25cbiAgICApIHtcbiAgICAgIGRhdGEgPSBvbGRMYXllckRhdGEuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IGZpbHRlcmVkSW5kZXgucmVkdWNlKChhY2N1LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBwb3MgPSBnZXRQb3NpdGlvbih7ZGF0YTogYWxsRGF0YVtpbmRleF19KTtcblxuICAgICAgICAvLyBpZiBkb2Vzbid0IGhhdmUgcG9pbnQgbGF0IG9yIGxuZywgZG8gbm90IGFkZCB0aGUgYXJjXG4gICAgICAgIC8vIGRlY2suZ2wgY2FuJ3QgaGFuZGxlIHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgaWYgKCFwb3MuZXZlcnkoTnVtYmVyLmlzRmluaXRlKSkge1xuICAgICAgICAgIHJldHVybiBhY2N1O1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdS5wdXNoKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBzb3VyY2VQb3NpdGlvbjogW3Bvc1swXSwgcG9zWzFdLCBwb3NbMl1dLFxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uOiBbcG9zWzNdLCBwb3NbNF0sIHBvc1s1XV0sXG4gICAgICAgICAgZGF0YTogYWxsRGF0YVtpbmRleF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3Ryb2tlV2lkdGggPSBzU2NhbGUgPyBkID0+XG4gICAgICAgdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHNTY2FsZSwgZC5kYXRhLCBzaXplRmllbGQsIDApIDogMTtcblxuICAgIGNvbnN0IGdldENvbG9yID0gY1NjYWxlID8gZCA9PlxuICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQuZGF0YSwgY29sb3JGaWVsZCkgOiBjb2xvcjtcblxuICAgIGNvbnN0IGdldFRhcmdldENvbG9yID0gY1NjYWxlID8gZCA9PlxuICAgICAgIHRoaXMuZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZShjU2NhbGUsIGQuZGF0YSwgY29sb3JGaWVsZClcbiAgICAgICAgOiB0YXJnZXRDb2xvciB8fCBjb2xvcjtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0Q29sb3IsXG4gICAgICBnZXRTb3VyY2VDb2xvcjogZ2V0Q29sb3IsXG4gICAgICBnZXRUYXJnZXRDb2xvcixcbiAgICAgIGdldFN0cm9rZVdpZHRoXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRQb3NpdGlvbikge1xuICAgIC8vIGdldCBib3VuZHMgZnJvbSBhcmNzXG4gICAgY29uc3Qgc0JvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGFsbERhdGEsIGQgPT4ge1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2RhdGE6IGR9KTtcbiAgICAgIHJldHVybiBbcG9zWzBdLCBwb3NbMV1dO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdEJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKGFsbERhdGEsIGQgPT4ge1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2RhdGE6IGR9KTtcbiAgICAgIHJldHVybiBbcG9zWzNdLCBwb3NbNF1dO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYm91bmRzID0gW1xuICAgICAgTWF0aC5taW4oc0JvdW5kc1swXSwgdEJvdW5kc1swXSksXG4gICAgICBNYXRoLm1pbihzQm91bmRzWzFdLCB0Qm91bmRzWzFdKSxcbiAgICAgIE1hdGgubWF4KHNCb3VuZHNbMl0sIHRCb3VuZHNbMl0pLFxuICAgICAgTWF0aC5tYXgoc0JvdW5kc1szXSwgdEJvdW5kc1szXSlcbiAgICBdO1xuXG4gICAgdGhpcy51cGRhdGVNZXRhKHtib3VuZHN9KTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKHtcbiAgICBkYXRhLFxuICAgIGlkeCxcbiAgICBvYmplY3RIb3ZlcmVkLFxuICAgIGxheWVySW50ZXJhY3Rpb24sXG4gICAgbWFwU3RhdGUsXG4gICAgaW50ZXJhY3Rpb25Db25maWdcbiAgfSkge1xuICAgIGNvbnN0IHticnVzaH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcblxuICAgIGNvbnN0IGNvbG9yVXBkYXRlVHJpZ2dlcnMgPSB7XG4gICAgICBjb2xvcjogdGhpcy5jb25maWcuY29sb3IsXG4gICAgICBjb2xvckZpZWxkOiB0aGlzLmNvbmZpZy5jb2xvckZpZWxkLFxuICAgICAgY29sb3JSYW5nZTogdGhpcy5jb25maWcudmlzQ29uZmlnLmNvbG9yUmFuZ2UsXG4gICAgICBjb2xvclNjYWxlOiB0aGlzLmNvbmZpZy5jb2xvclNjYWxlLFxuICAgICAgdGFyZ2V0Q29sb3I6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy50YXJnZXRDb2xvclxuICAgIH07XG5cbiAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHtcbiAgICAgIC8vIGF1dG8gaGlnaGxpZ2h0aW5nXG4gICAgICBwaWNrYWJsZTogdHJ1ZSxcbiAgICAgIGF1dG9IaWdobGlnaHQ6ICFicnVzaC5lbmFibGVkLFxuICAgICAgaGlnaGxpZ2h0Q29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuXG4gICAgICAvLyBicnVzaGluZ1xuICAgICAgYnJ1c2hSYWRpdXM6IGJydXNoLmNvbmZpZy5zaXplICogMTAwMCxcbiAgICAgIGJydXNoU291cmNlOiB0cnVlLFxuICAgICAgYnJ1c2hUYXJnZXQ6IHRydWUsXG4gICAgICBlbmFibGVCcnVzaGluZzogYnJ1c2guZW5hYmxlZFxuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IEFyY0JydXNoaW5nTGF5ZXIoe1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICAuLi5pbnRlcmFjdGlvbixcbiAgICAgICAgLi4ubGF5ZXJJbnRlcmFjdGlvbixcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGlkeCxcbiAgICAgICAgZnA2NDogdGhpcy5jb25maWcudmlzQ29uZmlnWydoaS1wcmVjaXNpb24nXSxcbiAgICAgICAgb3BhY2l0eTogdGhpcy5jb25maWcudmlzQ29uZmlnLm9wYWNpdHksXG4gICAgICAgIHBpY2tlZENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgICAgc3Ryb2tlU2NhbGU6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy50aGlja25lc3MsXG5cbiAgICAgICAgLy8gcGFyYW1ldGVyc1xuICAgICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBtYXBTdGF0ZS5kcmFnUm90YXRlfSxcblxuICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgIGdldFN0cm9rZVdpZHRoOiB7XG4gICAgICAgICAgICBzaXplRmllbGQ6IHRoaXMuY29uZmlnLnNpemVGaWVsZCxcbiAgICAgICAgICAgIHNpemVSYW5nZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnNpemVSYW5nZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0U291cmNlQ29sb3I6IGNvbG9yVXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgZ2V0VGFyZ2V0Q29sb3I6IGNvbG9yVXBkYXRlVHJpZ2dlcnNcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICBdO1xuICB9XG59XG4iXX0=