kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
231 lines (197 loc) • 27.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.LayerColorLegend = exports.MultiColorLegend = exports.SingleColorLegend = exports.LayerSizeLegend = exports.VisualChannelMetric = exports.StyledMapControlLegend = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _d3Color = require("d3-color");
var _colorLegend = _interopRequireDefault(require("../common/color-legend"));
var _defaultSettings = require("../../constants/default-settings");
var _reactIntl = require("react-intl");
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n padding: 10px 0 10px ", "px;\n font-size: 11px;\n border-bottom-color: ", ";\n border-bottom-style: solid;\n border-bottom-width: ", ";\n\n .legend--layer_name {\n font-size: 12px;\n padding-right: ", "px;\n color: ", ";\n font-weight: 500;\n }\n .legend--layer_type {\n color: ", ";\n font-weight: 500;\n font-size: 11px;\n padding-right: ", "px;\n }\n\n .legend--layer__title {\n padding-right: ", "px;\n }\n\n .legend--layer_by {\n color: ", ";\n }\n\n .legend--layer_color_field {\n color: ", ";\n font-weight: 500;\n }\n\n .legend--layer_color-legend {\n margin-top: 6px;\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var StyledMapControlLegend = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.mapControl.padding;
}, function (props) {
return props.theme.panelBorderColor;
}, function (props) {
return props.last ? 0 : '1px';
}, function (props) {
return props.theme.mapControl.padding;
}, function (props) {
return props.theme.textColorHl;
}, function (props) {
return props.theme.subtextColor;
}, function (props) {
return props.theme.mapControl.padding;
}, function (props) {
return props.theme.mapControl.padding;
}, function (props) {
return props.theme.subtextColor;
}, function (props) {
return props.theme.textColor;
});
exports.StyledMapControlLegend = StyledMapControlLegend;
var VisualChannelMetric = function VisualChannelMetric(_ref) {
var name = _ref.name;
return _react["default"].createElement("div", {
className: "legend--layer__title"
}, _react["default"].createElement("span", {
className: "legend--layer_by"
}, "by "), _react["default"].createElement("span", {
className: "legend--layer_color_field"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: name
})));
};
exports.VisualChannelMetric = VisualChannelMetric;
var LayerSizeLegend = function LayerSizeLegend(_ref2) {
var label = _ref2.label,
name = _ref2.name;
return _react["default"].createElement("div", {
className: "legend--layer_size-schema"
}, _react["default"].createElement("p", null, _react["default"].createElement("span", {
className: "legend--layer_by"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: label
}))), _react["default"].createElement(VisualChannelMetric, {
name: name
}));
};
exports.LayerSizeLegend = LayerSizeLegend;
var propTypes = {
layers: _propTypes["default"].arrayOf(_propTypes["default"].object)
};
var SingleColorDomain = [''];
var SingleColorLegend = _react["default"].memo(function (_ref3) {
var width = _ref3.width,
color = _ref3.color;
return _react["default"].createElement(_colorLegend["default"], {
scaleType: "ordinal",
displayLabel: false,
domain: SingleColorDomain,
fieldType: null,
range: [_d3Color.rgb.apply(void 0, (0, _toConsumableArray2["default"])(color)).toString()],
width: width
});
});
exports.SingleColorLegend = SingleColorLegend;
SingleColorLegend.displayName = 'SingleColorLegend';
var MultiColorLegend = _react["default"].memo(function (_ref4) {
var colorRange = _ref4.colorRange,
colorScale = _ref4.colorScale,
colorDomain = _ref4.colorDomain,
colorField = _ref4.colorField,
width = _ref4.width;
return _react["default"].createElement(_colorLegend["default"], {
scaleType: colorScale,
displayLabel: true,
domain: colorDomain,
fieldType: colorField && colorField.type || 'real',
range: colorRange.colors,
width: width
});
});
exports.MultiColorLegend = MultiColorLegend;
MultiColorLegend.displayName = 'MultiColorLegend';
var LayerColorLegend = _react["default"].memo(function (_ref5) {
var description = _ref5.description,
config = _ref5.config,
width = _ref5.width,
colorChannel = _ref5.colorChannel;
var enableColorBy = description.measure;
var scale = colorChannel.scale,
field = colorChannel.field,
domain = colorChannel.domain,
range = colorChannel.range,
property = colorChannel.property,
key = colorChannel.key;
var _map = [scale, field, domain].map(function (k) {
return config[k];
}),
_map2 = (0, _slicedToArray2["default"])(_map, 3),
colorScale = _map2[0],
colorField = _map2[1],
colorDomain = _map2[2];
var colorRange = config.visConfig[range];
return _react["default"].createElement("div", null, _react["default"].createElement("div", {
className: "legend--layer_type"
}, _react["default"].createElement(_reactIntl.FormattedMessage, {
id: "layer.".concat(key)
})), _react["default"].createElement("div", {
className: "legend--layer_color-schema"
}, _react["default"].createElement("div", null, enableColorBy ? _react["default"].createElement(VisualChannelMetric, {
name: enableColorBy
}) : null, _react["default"].createElement("div", {
className: "legend--layer_color-legend"
}, enableColorBy ? _react["default"].createElement(MultiColorLegend, {
colorScale: colorScale,
colorField: colorField,
colorDomain: colorDomain,
colorRange: colorRange,
width: width
}) : _react["default"].createElement(SingleColorLegend, {
color: config.visConfig[property] || config[property] || config.color,
width: width
})))));
});
exports.LayerColorLegend = LayerColorLegend;
LayerColorLegend.displayName = 'LayerColorLegend';
var isColorChannel = function isColorChannel(visualChannel) {
return [_defaultSettings.CHANNEL_SCALES.color, _defaultSettings.CHANNEL_SCALES.colorAggr].includes(visualChannel.channelScaleType);
};
var MAP_LEGEND_WIDTH = _defaultSettings.DIMENSIONS.mapControl.width - 2 * _defaultSettings.DIMENSIONS.mapControl.padding;
var MapLegend = function MapLegend(_ref6) {
var _ref6$layers = _ref6.layers,
layers = _ref6$layers === void 0 ? [] : _ref6$layers;
return _react["default"].createElement("div", {
className: "map-legend"
}, layers.map(function (layer, index) {
if (!layer.isValidToSave()) {
return null;
}
var colorChannels = Object.values(layer.visualChannels).filter(isColorChannel);
var nonColorChannels = Object.values(layer.visualChannels).filter(function (vc) {
return !isColorChannel(vc);
});
return _react["default"].createElement(StyledMapControlLegend, {
className: "legend--layer",
last: index === layers.length - 1,
key: index
}, _react["default"].createElement("div", {
className: "legend--layer_name"
}, layer.config.label), colorChannels.map(function (colorChannel) {
return !colorChannel.condition || colorChannel.condition(layer.config) ? _react["default"].createElement(LayerColorLegend, {
key: colorChannel.key,
description: layer.getVisualChannelDescription(colorChannel.key),
config: layer.config,
width: MAP_LEGEND_WIDTH,
colorChannel: colorChannel
}) : null;
}), nonColorChannels.map(function (visualChannel) {
var matchCondition = !visualChannel.condition || visualChannel.condition(layer.config);
var enabled = layer.config[visualChannel.field] || visualChannel.defaultMeasure;
var description = layer.getVisualChannelDescription(visualChannel.key);
return matchCondition && enabled ? _react["default"].createElement(LayerSizeLegend, {
key: visualChannel.key,
label: description.label,
name: description.measure
}) : null;
}));
}));
};
MapLegend.propTypes = propTypes;
var _default = MapLegend;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtbGVnZW5kLmpzIl0sIm5hbWVzIjpbIlN0eWxlZE1hcENvbnRyb2xMZWdlbmQiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwibWFwQ29udHJvbCIsInBhZGRpbmciLCJwYW5lbEJvcmRlckNvbG9yIiwibGFzdCIsInRleHRDb2xvckhsIiwic3VidGV4dENvbG9yIiwidGV4dENvbG9yIiwiVmlzdWFsQ2hhbm5lbE1ldHJpYyIsIm5hbWUiLCJMYXllclNpemVMZWdlbmQiLCJsYWJlbCIsInByb3BUeXBlcyIsImxheWVycyIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJvYmplY3QiLCJTaW5nbGVDb2xvckRvbWFpbiIsIlNpbmdsZUNvbG9yTGVnZW5kIiwiUmVhY3QiLCJtZW1vIiwid2lkdGgiLCJjb2xvciIsInJnYiIsInRvU3RyaW5nIiwiZGlzcGxheU5hbWUiLCJNdWx0aUNvbG9yTGVnZW5kIiwiY29sb3JSYW5nZSIsImNvbG9yU2NhbGUiLCJjb2xvckRvbWFpbiIsImNvbG9yRmllbGQiLCJ0eXBlIiwiY29sb3JzIiwiTGF5ZXJDb2xvckxlZ2VuZCIsImRlc2NyaXB0aW9uIiwiY29uZmlnIiwiY29sb3JDaGFubmVsIiwiZW5hYmxlQ29sb3JCeSIsIm1lYXN1cmUiLCJzY2FsZSIsImZpZWxkIiwiZG9tYWluIiwicmFuZ2UiLCJwcm9wZXJ0eSIsImtleSIsIm1hcCIsImsiLCJ2aXNDb25maWciLCJpc0NvbG9yQ2hhbm5lbCIsInZpc3VhbENoYW5uZWwiLCJDSEFOTkVMX1NDQUxFUyIsImNvbG9yQWdnciIsImluY2x1ZGVzIiwiY2hhbm5lbFNjYWxlVHlwZSIsIk1BUF9MRUdFTkRfV0lEVEgiLCJESU1FTlNJT05TIiwiTWFwTGVnZW5kIiwibGF5ZXIiLCJpbmRleCIsImlzVmFsaWRUb1NhdmUiLCJjb2xvckNoYW5uZWxzIiwiT2JqZWN0IiwidmFsdWVzIiwidmlzdWFsQ2hhbm5lbHMiLCJmaWx0ZXIiLCJub25Db2xvckNoYW5uZWxzIiwidmMiLCJsZW5ndGgiLCJjb25kaXRpb24iLCJnZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24iLCJtYXRjaENvbmRpdGlvbiIsImVuYWJsZWQiLCJkZWZhdWx0TWVhc3VyZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFTyxJQUFNQSxzQkFBc0IsR0FBR0MsNkJBQU9DLEdBQVYsb0JBQ1YsVUFBQUMsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxVQUFaLENBQXVCQyxPQUEzQjtBQUFBLENBREssRUFHVixVQUFBSCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlHLGdCQUFoQjtBQUFBLENBSEssRUFLVixVQUFBSixLQUFLO0FBQUEsU0FBS0EsS0FBSyxDQUFDSyxJQUFOLEdBQWEsQ0FBYixHQUFpQixLQUF0QjtBQUFBLENBTEssRUFTZCxVQUFBTCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFVBQVosQ0FBdUJDLE9BQTNCO0FBQUEsQ0FUUyxFQVV0QixVQUFBSCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlLLFdBQWhCO0FBQUEsQ0FWaUIsRUFjdEIsVUFBQU4sS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxZQUFoQjtBQUFBLENBZGlCLEVBaUJkLFVBQUFQLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsVUFBWixDQUF1QkMsT0FBM0I7QUFBQSxDQWpCUyxFQXFCZCxVQUFBSCxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFVBQVosQ0FBdUJDLE9BQTNCO0FBQUEsQ0FyQlMsRUF5QnRCLFVBQUFILEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWU0sWUFBaEI7QUFBQSxDQXpCaUIsRUE2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QyxXQUFXLEdBQUd1QixLQUFLLENBQUNZLDJCQUFOLENBQWtDcEIsYUFBYSxDQUFDTCxHQUFoRCxDQUFwQjtBQUVBLGFBQU8wQixjQUFjLElBQUlDLE9BQWxCLEdBQ0wsZ0NBQUMsZUFBRDtBQUNFLFFBQUEsR0FBRyxFQUFFdEIsYUFBYSxDQUFDTCxHQURyQjtBQUVFLFFBQUEsS0FBSyxFQUFFVixXQUFXLENBQUN2QixLQUZyQjtBQUdFLFFBQUEsSUFBSSxFQUFFdUIsV0FBVyxDQUFDSTtBQUhwQixRQURLLEdBTUgsSUFOSjtBQU9ELEtBZEEsQ0FqQkgsQ0FERjtBQW1DRCxHQTdDQSxDQURILENBRGdCO0FBQUEsQ0FBbEI7O0FBbURBa0IsU0FBUyxDQUFDNUMsU0FBVixHQUFzQkEsU0FBdEI7ZUFFZTRDLFMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjAgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtyZ2J9IGZyb20gJ2QzLWNvbG9yJztcbmltcG9ydCBDb2xvckxlZ2VuZCBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9jb2xvci1sZWdlbmQnO1xuaW1wb3J0IHtDSEFOTkVMX1NDQUxFUywgRElNRU5TSU9OU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdyZWFjdC1pbnRsJztcblxuZXhwb3J0IGNvbnN0IFN0eWxlZE1hcENvbnRyb2xMZWdlbmQgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiAxMHB4IDAgMTBweCAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQm9yZGVyQ29sb3J9O1xuICBib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogJHtwcm9wcyA9PiAocHJvcHMubGFzdCA/IDAgOiAnMXB4Jyl9O1xuXG4gIC5sZWdlbmQtLWxheWVyX25hbWUge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgfVxuICAubGVnZW5kLS1sYXllcl90eXBlIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgZm9udC1zaXplOiAxMXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubWFwQ29udHJvbC5wYWRkaW5nfXB4O1xuICB9XG5cbiAgLmxlZ2VuZC0tbGF5ZXJfX3RpdGxlIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1hcENvbnRyb2wucGFkZGluZ31weDtcbiAgfVxuXG4gIC5sZWdlbmQtLWxheWVyX2J5IHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICB9XG5cbiAgLmxlZ2VuZC0tbGF5ZXJfY29sb3JfZmllbGQge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgfVxuXG4gIC5sZWdlbmQtLWxheWVyX2NvbG9yLWxlZ2VuZCB7XG4gICAgbWFyZ2luLXRvcDogNnB4O1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgVmlzdWFsQ2hhbm5lbE1ldHJpYyA9ICh7bmFtZX0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImxlZ2VuZC0tbGF5ZXJfX3RpdGxlXCI+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX2J5XCI+YnkgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibGVnZW5kLS1sYXllcl9jb2xvcl9maWVsZFwiPlxuICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17bmFtZX0gLz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBMYXllclNpemVMZWdlbmQgPSAoe2xhYmVsLCBuYW1lfSkgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT1cImxlZ2VuZC0tbGF5ZXJfc2l6ZS1zY2hlbWFcIj5cbiAgICA8cD5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImxlZ2VuZC0tbGF5ZXJfYnlcIj5cbiAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9e2xhYmVsfSAvPlxuICAgICAgPC9zcGFuPlxuICAgIDwvcD5cbiAgICA8VmlzdWFsQ2hhbm5lbE1ldHJpYyBuYW1lPXtuYW1lfSAvPlxuICA8L2Rpdj5cbik7XG5cbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgbGF5ZXJzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KVxufTtcblxuY29uc3QgU2luZ2xlQ29sb3JEb21haW4gPSBbJyddO1xuZXhwb3J0IGNvbnN0IFNpbmdsZUNvbG9yTGVnZW5kID0gUmVhY3QubWVtbygoe3dpZHRoLCBjb2xvcn0pID0+IChcbiAgPENvbG9yTGVnZW5kXG4gICAgc2NhbGVUeXBlPVwib3JkaW5hbFwiXG4gICAgZGlzcGxheUxhYmVsPXtmYWxzZX1cbiAgICBkb21haW49e1NpbmdsZUNvbG9yRG9tYWlufVxuICAgIGZpZWxkVHlwZT17bnVsbH1cbiAgICByYW5nZT17W3JnYiguLi5jb2xvcikudG9TdHJpbmcoKV19XG4gICAgd2lkdGg9e3dpZHRofVxuICAvPlxuKSk7XG5cblNpbmdsZUNvbG9yTGVnZW5kLmRpc3BsYXlOYW1lID0gJ1NpbmdsZUNvbG9yTGVnZW5kJztcblxuZXhwb3J0IGNvbnN0IE11bHRpQ29sb3JMZWdlbmQgPSBSZWFjdC5tZW1vKFxuICAoe2NvbG9yUmFuZ2UsIGNvbG9yU2NhbGUsIGNvbG9yRG9tYWluLCBjb2xvckZpZWxkLCB3aWR0aH0pID0+IChcbiAgICA8Q29sb3JMZWdlbmRcbiAgICAgIHNjYWxlVHlwZT17Y29sb3JTY2FsZX1cbiAgICAgIGRpc3BsYXlMYWJlbFxuICAgICAgZG9tYWluPXtjb2xvckRvbWFpbn1cbiAgICAgIGZpZWxkVHlwZT17KGNvbG9yRmllbGQgJiYgY29sb3JGaWVsZC50eXBlKSB8fCAncmVhbCd9XG4gICAgICByYW5nZT17Y29sb3JSYW5nZS5jb2xvcnN9XG4gICAgICB3aWR0aD17d2lkdGh9XG4gICAgLz5cbiAgKVxuKTtcblxuTXVsdGlDb2xvckxlZ2VuZC5kaXNwbGF5TmFtZSA9ICdNdWx0aUNvbG9yTGVnZW5kJztcblxuZXhwb3J0IGNvbnN0IExheWVyQ29sb3JMZWdlbmQgPSBSZWFjdC5tZW1vKCh7ZGVzY3JpcHRpb24sIGNvbmZpZywgd2lkdGgsIGNvbG9yQ2hhbm5lbH0pID0+IHtcbiAgY29uc3QgZW5hYmxlQ29sb3JCeSA9IGRlc2NyaXB0aW9uLm1lYXN1cmU7XG4gIGNvbnN0IHtzY2FsZSwgZmllbGQsIGRvbWFpbiwgcmFuZ2UsIHByb3BlcnR5LCBrZXl9ID0gY29sb3JDaGFubmVsO1xuICBjb25zdCBbY29sb3JTY2FsZSwgY29sb3JGaWVsZCwgY29sb3JEb21haW5dID0gW3NjYWxlLCBmaWVsZCwgZG9tYWluXS5tYXAoayA9PiBjb25maWdba10pO1xuICBjb25zdCBjb2xvclJhbmdlID0gY29uZmlnLnZpc0NvbmZpZ1tyYW5nZV07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX3R5cGVcIj5cbiAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9e2BsYXllci4ke2tleX1gfSAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImxlZ2VuZC0tbGF5ZXJfY29sb3Itc2NoZW1hXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAge2VuYWJsZUNvbG9yQnkgPyA8VmlzdWFsQ2hhbm5lbE1ldHJpYyBuYW1lPXtlbmFibGVDb2xvckJ5fSAvPiA6IG51bGx9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyX2NvbG9yLWxlZ2VuZFwiPlxuICAgICAgICAgICAge2VuYWJsZUNvbG9yQnkgPyAoXG4gICAgICAgICAgICAgIDxNdWx0aUNvbG9yTGVnZW5kXG4gICAgICAgICAgICAgICAgY29sb3JTY2FsZT17Y29sb3JTY2FsZX1cbiAgICAgICAgICAgICAgICBjb2xvckZpZWxkPXtjb2xvckZpZWxkfVxuICAgICAgICAgICAgICAgIGNvbG9yRG9tYWluPXtjb2xvckRvbWFpbn1cbiAgICAgICAgICAgICAgICBjb2xvclJhbmdlPXtjb2xvclJhbmdlfVxuICAgICAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxTaW5nbGVDb2xvckxlZ2VuZFxuICAgICAgICAgICAgICAgIGNvbG9yPXtjb25maWcudmlzQ29uZmlnW3Byb3BlcnR5XSB8fCBjb25maWdbcHJvcGVydHldIHx8IGNvbmZpZy5jb2xvcn1cbiAgICAgICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufSk7XG5cbkxheWVyQ29sb3JMZWdlbmQuZGlzcGxheU5hbWUgPSAnTGF5ZXJDb2xvckxlZ2VuZCc7XG5cbmNvbnN0IGlzQ29sb3JDaGFubmVsID0gdmlzdWFsQ2hhbm5lbCA9PlxuICBbQ0hBTk5FTF9TQ0FMRVMuY29sb3IsIENIQU5ORUxfU0NBTEVTLmNvbG9yQWdncl0uaW5jbHVkZXModmlzdWFsQ2hhbm5lbC5jaGFubmVsU2NhbGVUeXBlKTtcblxuY29uc3QgTUFQX0xFR0VORF9XSURUSCA9IERJTUVOU0lPTlMubWFwQ29udHJvbC53aWR0aCAtIDIgKiBESU1FTlNJT05TLm1hcENvbnRyb2wucGFkZGluZztcblxuY29uc3QgTWFwTGVnZW5kID0gKHtsYXllcnMgPSBbXX0pID0+IChcbiAgPGRpdiBjbGFzc05hbWU9XCJtYXAtbGVnZW5kXCI+XG4gICAge2xheWVycy5tYXAoKGxheWVyLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFsYXllci5pc1ZhbGlkVG9TYXZlKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbG9yQ2hhbm5lbHMgPSBPYmplY3QudmFsdWVzKGxheWVyLnZpc3VhbENoYW5uZWxzKS5maWx0ZXIoaXNDb2xvckNoYW5uZWwpO1xuICAgICAgY29uc3Qgbm9uQ29sb3JDaGFubmVscyA9IE9iamVjdC52YWx1ZXMobGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZpbHRlcihcbiAgICAgICAgdmMgPT4gIWlzQ29sb3JDaGFubmVsKHZjKVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZE1hcENvbnRyb2xMZWdlbmRcbiAgICAgICAgICBjbGFzc05hbWU9XCJsZWdlbmQtLWxheWVyXCJcbiAgICAgICAgICBsYXN0PXtpbmRleCA9PT0gbGF5ZXJzLmxlbmd0aCAtIDF9XG4gICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGVnZW5kLS1sYXllcl9uYW1lXCI+e2xheWVyLmNvbmZpZy5sYWJlbH08L2Rpdj5cbiAgICAgICAgICB7Y29sb3JDaGFubmVscy5tYXAoY29sb3JDaGFubmVsID0+XG4gICAgICAgICAgICAhY29sb3JDaGFubmVsLmNvbmRpdGlvbiB8fCBjb2xvckNoYW5uZWwuY29uZGl0aW9uKGxheWVyLmNvbmZpZykgPyAoXG4gICAgICAgICAgICAgIDxMYXllckNvbG9yTGVnZW5kXG4gICAgICAgICAgICAgICAga2V5PXtjb2xvckNoYW5uZWwua2V5fVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oY29sb3JDaGFubmVsLmtleSl9XG4gICAgICAgICAgICAgICAgY29uZmlnPXtsYXllci5jb25maWd9XG4gICAgICAgICAgICAgICAgd2lkdGg9e01BUF9MRUdFTkRfV0lEVEh9XG4gICAgICAgICAgICAgICAgY29sb3JDaGFubmVsPXtjb2xvckNoYW5uZWx9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbFxuICAgICAgICAgICl9XG4gICAgICAgICAge25vbkNvbG9yQ2hhbm5lbHMubWFwKHZpc3VhbENoYW5uZWwgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hDb25kaXRpb24gPVxuICAgICAgICAgICAgICAhdmlzdWFsQ2hhbm5lbC5jb25kaXRpb24gfHwgdmlzdWFsQ2hhbm5lbC5jb25kaXRpb24obGF5ZXIuY29uZmlnKTtcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBsYXllci5jb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF0gfHwgdmlzdWFsQ2hhbm5lbC5kZWZhdWx0TWVhc3VyZTtcblxuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24odmlzdWFsQ2hhbm5lbC5rZXkpO1xuXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hDb25kaXRpb24gJiYgZW5hYmxlZCA/IChcbiAgICAgICAgICAgICAgPExheWVyU2l6ZUxlZ2VuZFxuICAgICAgICAgICAgICAgIGtleT17dmlzdWFsQ2hhbm5lbC5rZXl9XG4gICAgICAgICAgICAgICAgbGFiZWw9e2Rlc2NyaXB0aW9uLmxhYmVsfVxuICAgICAgICAgICAgICAgIG5hbWU9e2Rlc2NyaXB0aW9uLm1lYXN1cmV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbDtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9TdHlsZWRNYXBDb250cm9sTGVnZW5kPlxuICAgICAgKTtcbiAgICB9KX1cbiAgPC9kaXY+XG4pO1xuXG5NYXBMZWdlbmQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnQgZGVmYXVsdCBNYXBMZWdlbmQ7XG4iXX0=