kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
222 lines (220 loc) • 37.8 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.StyledLayerName = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _styledComponents2 = require("../common/styled-components");
var _icons = require("../common/icons");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _commonUtils = require("@kepler.gl/common-utils");
var _utils = require("@kepler.gl/utils");
var _reducers = require("@kepler.gl/reducers");
var _reactIntl = require("react-intl");
var _excluded = ["fieldsToShow"];
var _templateObject, _templateObject2, _templateObject3; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var StyledLayerName = exports.StyledLayerName = (0, _styledComponents["default"])(_styledComponents2.CenterFlexbox)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 12px;\n letter-spacing: 0.43px;\n text-transform: capitalize;\n\n svg {\n margin-right: 4px;\n }\n"])), function (props) {
return props.theme.textColorHl;
});
var StyledTable = _styledComponents["default"].table(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n & .row__delta-value {\n text-align: right;\n margin-left: 6px;\n\n &.positive {\n color: ", ";\n }\n\n &.negative {\n color: ", ";\n }\n }\n & .row__value,\n & .row__name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: no-wrap;\n }\n"])), function (props) {
return props.theme.notificationColors.success;
}, function (props) {
return props.theme.negativeBtnActBgd;
});
var StyledDivider = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n // offset divider to reach popover edge\n margin-left: -14px;\n margin-right: -14px;\n border-bottom: 1px solid ", ";\n"])), function (props) {
return props.theme.panelBorderColor;
});
var Row = function Row(_ref) {
var name = _ref.name,
value = _ref.value,
deltaValue = _ref.deltaValue,
url = _ref.url;
// Set 'url' to 'value' if it looks like a url
if (!url && value && typeof value === 'string' && value.match(/^http/)) {
url = value;
}
var asImg = /<img>/.test(name);
return /*#__PURE__*/_react["default"].createElement("tr", {
className: "layer-hover-info__row",
key: name
}, /*#__PURE__*/_react["default"].createElement("td", {
className: "row__name"
}, asImg ? name.replace('<img>', '') : name), /*#__PURE__*/_react["default"].createElement("td", {
className: "row__value"
}, asImg ? /*#__PURE__*/_react["default"].createElement("img", {
src: value
}) : url ? /*#__PURE__*/_react["default"].createElement("a", {
target: "_blank",
rel: "noopener noreferrer",
href: url
}, value) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", null, value), (0, _commonUtils.notNullorUndefined)(deltaValue) ? /*#__PURE__*/_react["default"].createElement("span", {
className: "row__delta-value ".concat((deltaValue === null || deltaValue === void 0 ? void 0 : deltaValue.toString().charAt(0)) === '+' ? 'positive' : 'negative')
}, deltaValue) : null)));
};
var EntryInfo = function EntryInfo(_ref2) {
var fieldsToShow = _ref2.fieldsToShow,
props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
return /*#__PURE__*/_react["default"].createElement("tbody", null, fieldsToShow.map(function (item) {
return /*#__PURE__*/_react["default"].createElement(EntryInfoRow, (0, _extends2["default"])({
key: item.name,
item: item
}, props));
}));
};
var EntryInfoRow = function EntryInfoRow(_ref3) {
var layer = _ref3.layer,
item = _ref3.item,
fields = _ref3.fields,
data = _ref3.data,
primaryData = _ref3.primaryData,
compareType = _ref3.compareType,
currentTime = _ref3.currentTime;
var fieldIdx = fields.findIndex(function (f) {
return f.name === item.name;
});
if (fieldIdx < 0) {
return null;
}
var field = fields[fieldIdx];
var fieldValueAccessor = layer.accessVSFieldValue(field, currentTime);
var value = fieldValueAccessor(field, data instanceof _utils.DataRow ? {
index: data._rowIndex
} : data);
var primaryValue = primaryData ? fieldValueAccessor(field, primaryData instanceof _utils.DataRow ? {
index: primaryData._rowIndex
} : primaryData) : null;
var displayValue = (0, _reducers.getTooltipDisplayValue)({
item: item,
field: field,
value: value
});
var displayDeltaValue = primaryData ? (0, _reducers.getTooltipDisplayDeltaValue)({
field: field,
value: value,
primaryValue: primaryValue,
compareType: compareType
}) : null;
return /*#__PURE__*/_react["default"].createElement(Row, {
name: field.displayName || field.name,
value: displayValue,
deltaValue: displayDeltaValue
});
};
// TODO: supporting comparative value for aggregated cells as well
var CellInfo = function CellInfo(_ref4) {
var fieldsToShow = _ref4.fieldsToShow,
data = _ref4.data,
layer = _ref4.layer;
var _ref5 = layer.config,
colorField = _ref5.colorField,
sizeField = _ref5.sizeField;
var colorValue = (0, _react.useMemo)(function () {
if (colorField && layer.visualChannels.color) {
var item = fieldsToShow.find(function (field) {
return field.name === colorField.name;
});
return (0, _reducers.getTooltipDisplayValue)({
item: item,
field: colorField,
value: data.colorValue
});
}
return null;
}, [fieldsToShow, colorField, layer, data.colorValue]);
var elevationValue = (0, _react.useMemo)(function () {
if (sizeField && layer.visualChannels.size) {
var item = fieldsToShow.find(function (field) {
return field.name === sizeField.name;
});
return (0, _reducers.getTooltipDisplayValue)({
item: item,
field: sizeField,
value: data.elevationValue
});
}
return null;
}, [fieldsToShow, sizeField, layer, data.elevationValue]);
var aggregatedData = (0, _react.useMemo)(function () {
if (data.aggregatedData && fieldsToShow) {
return fieldsToShow.reduce(function (acc, field) {
var _data$aggregatedData;
var dataForField = (_data$aggregatedData = data.aggregatedData) === null || _data$aggregatedData === void 0 ? void 0 : _data$aggregatedData[field.name];
if (dataForField !== null && dataForField !== void 0 && dataForField.measure && field.name !== (colorField === null || colorField === void 0 ? void 0 : colorField.name)) {
acc.push({
name: "".concat((0, _utils.capitalizeFirstLetter)(dataForField.measure), " of ").concat(field.name),
value: dataForField.value
});
}
return acc;
}, []);
}
return [];
}, [data.aggregatedData, fieldsToShow, colorField === null || colorField === void 0 ? void 0 : colorField.name]);
var colorMeasure = layer.getVisualChannelDescription('color').measure;
var sizeMeasure = layer.getVisualChannelDescription('size').measure;
return /*#__PURE__*/_react["default"].createElement("tbody", null, /*#__PURE__*/_react["default"].createElement(Row, {
name: 'total points',
key: "count",
value: String(data.points && data.points.length)
}), colorField && layer.visualChannels.color && colorMeasure ? /*#__PURE__*/_react["default"].createElement(Row, {
name: colorMeasure,
key: "color",
value: colorValue || 'N/A'
}) : null, sizeField && layer.visualChannels.size && sizeMeasure ? /*#__PURE__*/_react["default"].createElement(Row, {
name: sizeMeasure,
key: "size",
value: elevationValue || 'N/A'
}) : null, aggregatedData.map(function (dataForField, idx) {
return /*#__PURE__*/_react["default"].createElement(Row, {
name: dataForField.name,
key: "data_".concat(idx),
value: dataForField.value || 'N/A'
});
}));
};
var LayerHoverInfoFactory = function LayerHoverInfoFactory() {
var LayerHoverInfo = function LayerHoverInfo(props) {
var data = props.data,
layer = props.layer;
var intl = (0, _reactIntl.useIntl)();
if (!data || !layer) {
return null;
}
var hasFieldsToShow = data.fieldValues && Object.keys(data.fieldValues).length > 0 || props.fieldsToShow && props.fieldsToShow.length > 0;
return /*#__PURE__*/_react["default"].createElement("div", {
className: "map-popover__layer-info"
}, /*#__PURE__*/_react["default"].createElement(StyledLayerName, {
className: "map-popover__layer-name"
}, /*#__PURE__*/_react["default"].createElement(_icons.Layers, {
height: "12px"
}), props.layer.config.label), hasFieldsToShow && /*#__PURE__*/_react["default"].createElement(StyledDivider, null), /*#__PURE__*/_react["default"].createElement(StyledTable, null, data.fieldValues ? /*#__PURE__*/_react["default"].createElement("tbody", null, data.fieldValues.map(function (_ref6, i) {
var labelMessage = _ref6.labelMessage,
value = _ref6.value;
return /*#__PURE__*/_react["default"].createElement(Row, {
key: i,
name: intl.formatMessage({
id: labelMessage
}),
value: value
});
})) : props.layer.isAggregated ? /*#__PURE__*/_react["default"].createElement(CellInfo, props) : /*#__PURE__*/_react["default"].createElement(EntryInfo, props)), hasFieldsToShow && /*#__PURE__*/_react["default"].createElement(StyledDivider, null));
};
LayerHoverInfo.propTypes = {
fields: _propTypes["default"].arrayOf(_propTypes["default"].any),
fieldsToShow: _propTypes["default"].arrayOf(_propTypes["default"].any),
layer: _propTypes["default"].object,
data: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].any), _propTypes["default"].object])
};
return LayerHoverInfo;
};
var _default = exports["default"] = LayerHoverInfoFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfaWNvbnMiLCJfcHJvcFR5cGVzIiwiX2NvbW1vblV0aWxzIiwiX3V0aWxzIiwiX3JlZHVjZXJzIiwiX3JlYWN0SW50bCIsIl9leGNsdWRlZCIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU3R5bGVkTGF5ZXJOYW1lIiwiZXhwb3J0cyIsInN0eWxlZCIsIkNlbnRlckZsZXhib3giLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJ0ZXh0Q29sb3JIbCIsIlN0eWxlZFRhYmxlIiwidGFibGUiLCJub3RpZmljYXRpb25Db2xvcnMiLCJzdWNjZXNzIiwibmVnYXRpdmVCdG5BY3RCZ2QiLCJTdHlsZWREaXZpZGVyIiwiZGl2IiwicGFuZWxCb3JkZXJDb2xvciIsIlJvdyIsIl9yZWYiLCJuYW1lIiwidmFsdWUiLCJkZWx0YVZhbHVlIiwidXJsIiwibWF0Y2giLCJhc0ltZyIsInRlc3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwia2V5IiwicmVwbGFjZSIsInNyYyIsInRhcmdldCIsInJlbCIsImhyZWYiLCJGcmFnbWVudCIsIm5vdE51bGxvclVuZGVmaW5lZCIsImNvbmNhdCIsInRvU3RyaW5nIiwiY2hhckF0IiwiRW50cnlJbmZvIiwiX3JlZjIiLCJmaWVsZHNUb1Nob3ciLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwibWFwIiwiaXRlbSIsIkVudHJ5SW5mb1JvdyIsIl9leHRlbmRzMiIsIl9yZWYzIiwibGF5ZXIiLCJmaWVsZHMiLCJkYXRhIiwicHJpbWFyeURhdGEiLCJjb21wYXJlVHlwZSIsImN1cnJlbnRUaW1lIiwiZmllbGRJZHgiLCJmaW5kSW5kZXgiLCJmIiwiZmllbGQiLCJmaWVsZFZhbHVlQWNjZXNzb3IiLCJhY2Nlc3NWU0ZpZWxkVmFsdWUiLCJEYXRhUm93IiwiaW5kZXgiLCJfcm93SW5kZXgiLCJwcmltYXJ5VmFsdWUiLCJkaXNwbGF5VmFsdWUiLCJnZXRUb29sdGlwRGlzcGxheVZhbHVlIiwiZGlzcGxheURlbHRhVmFsdWUiLCJnZXRUb29sdGlwRGlzcGxheURlbHRhVmFsdWUiLCJkaXNwbGF5TmFtZSIsIkNlbGxJbmZvIiwiX3JlZjQiLCJfcmVmNSIsImNvbmZpZyIsImNvbG9yRmllbGQiLCJzaXplRmllbGQiLCJjb2xvclZhbHVlIiwidXNlTWVtbyIsInZpc3VhbENoYW5uZWxzIiwiY29sb3IiLCJmaW5kIiwiZWxldmF0aW9uVmFsdWUiLCJzaXplIiwiYWdncmVnYXRlZERhdGEiLCJyZWR1Y2UiLCJhY2MiLCJfZGF0YSRhZ2dyZWdhdGVkRGF0YSIsImRhdGFGb3JGaWVsZCIsIm1lYXN1cmUiLCJwdXNoIiwiY2FwaXRhbGl6ZUZpcnN0TGV0dGVyIiwiY29sb3JNZWFzdXJlIiwiZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uIiwic2l6ZU1lYXN1cmUiLCJTdHJpbmciLCJwb2ludHMiLCJsZW5ndGgiLCJpZHgiLCJMYXllckhvdmVySW5mb0ZhY3RvcnkiLCJMYXllckhvdmVySW5mbyIsImludGwiLCJ1c2VJbnRsIiwiaGFzRmllbGRzVG9TaG93IiwiZmllbGRWYWx1ZXMiLCJrZXlzIiwiTGF5ZXJzIiwiaGVpZ2h0IiwibGFiZWwiLCJfcmVmNiIsImxhYmVsTWVzc2FnZSIsImZvcm1hdE1lc3NhZ2UiLCJpZCIsImlzQWdncmVnYXRlZCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJhbnkiLCJvYmplY3QiLCJvbmVPZlR5cGUiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXAvbGF5ZXItaG92ZXItaW5mby50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge0NvbXBhcmVUeXBlLCBGaWVsZCwgTWVyZ2UsIFRvb2x0aXBGaWVsZH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0NlbnRlckZsZXhib3h9IGZyb20gJy4uL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge0xheWVyc30gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge25vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtEYXRhUm93fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGEsXG4gIExheWVySG92ZXJQcm9wLFxuICBnZXRUb29sdGlwRGlzcGxheURlbHRhVmFsdWUsXG4gIGdldFRvb2x0aXBEaXNwbGF5VmFsdWVcbn0gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG5pbXBvcnQge3VzZUludGx9IGZyb20gJ3JlYWN0LWludGwnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7Y2FwaXRhbGl6ZUZpcnN0TGV0dGVyfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFN0eWxlZExheWVyTmFtZSA9IHN0eWxlZChDZW50ZXJGbGV4Ym94KWBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICBmb250LXNpemU6IDEycHg7XG4gIGxldHRlci1zcGFjaW5nOiAwLjQzcHg7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuXG4gIHN2ZyB7XG4gICAgbWFyZ2luLXJpZ2h0OiA0cHg7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFRhYmxlID0gc3R5bGVkLnRhYmxlYFxuICAmIC5yb3dfX2RlbHRhLXZhbHVlIHtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBtYXJnaW4tbGVmdDogNnB4O1xuXG4gICAgJi5wb3NpdGl2ZSB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ub3RpZmljYXRpb25Db2xvcnMuc3VjY2Vzc307XG4gICAgfVxuXG4gICAgJi5uZWdhdGl2ZSB7XG4gICAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5uZWdhdGl2ZUJ0bkFjdEJnZH07XG4gICAgfVxuICB9XG4gICYgLnJvd19fdmFsdWUsXG4gICYgLnJvd19fbmFtZSB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm8td3JhcDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRGl2aWRlciA9IHN0eWxlZC5kaXZgXG4gIC8vIG9mZnNldCBkaXZpZGVyIHRvIHJlYWNoIHBvcG92ZXIgZWRnZVxuICBtYXJnaW4tbGVmdDogLTE0cHg7XG4gIG1hcmdpbi1yaWdodDogLTE0cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQm9yZGVyQ29sb3J9O1xuYDtcblxuaW50ZXJmYWNlIFJvd1Byb3BzIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBkZWx0YVZhbHVlPzogc3RyaW5nIHwgbnVsbDtcbiAgdXJsPzogc3RyaW5nO1xufVxuXG5jb25zdCBSb3c6IFJlYWN0LkZDPFJvd1Byb3BzPiA9ICh7bmFtZSwgdmFsdWUsIGRlbHRhVmFsdWUsIHVybH0pID0+IHtcbiAgLy8gU2V0ICd1cmwnIHRvICd2YWx1ZScgaWYgaXQgbG9va3MgbGlrZSBhIHVybFxuICBpZiAoIXVybCAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLm1hdGNoKC9eaHR0cC8pKSB7XG4gICAgdXJsID0gdmFsdWU7XG4gIH1cblxuICBjb25zdCBhc0ltZyA9IC88aW1nPi8udGVzdChuYW1lKTtcbiAgcmV0dXJuIChcbiAgICA8dHIgY2xhc3NOYW1lPVwibGF5ZXItaG92ZXItaW5mb19fcm93XCIga2V5PXtuYW1lfT5cbiAgICAgIDx0ZCBjbGFzc05hbWU9XCJyb3dfX25hbWVcIj57YXNJbWcgPyBuYW1lLnJlcGxhY2UoJzxpbWc+JywgJycpIDogbmFtZX08L3RkPlxuICAgICAgPHRkIGNsYXNzTmFtZT1cInJvd19fdmFsdWVcIj5cbiAgICAgICAge2FzSW1nID8gKFxuICAgICAgICAgIDxpbWcgc3JjPXt2YWx1ZX0gLz5cbiAgICAgICAgKSA6IHVybCA/IChcbiAgICAgICAgICA8YSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgaHJlZj17dXJsfT5cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxzcGFuPnt2YWx1ZX08L3NwYW4+XG4gICAgICAgICAgICB7bm90TnVsbG9yVW5kZWZpbmVkKGRlbHRhVmFsdWUpID8gKFxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHJvd19fZGVsdGEtdmFsdWUgJHtcbiAgICAgICAgICAgICAgICAgIGRlbHRhVmFsdWU/LnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAnKycgPyAncG9zaXRpdmUnIDogJ25lZ2F0aXZlJ1xuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2RlbHRhVmFsdWV9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgRW50cnlJbmZvUHJvcHMgPSBNZXJnZTxMYXllckhvdmVyUHJvcCwge2ZpZWxkc1RvU2hvdzogVG9vbHRpcEZpZWxkW119PjtcblxuY29uc3QgRW50cnlJbmZvOiBSZWFjdC5GQzxFbnRyeUluZm9Qcm9wcz4gPSAoe2ZpZWxkc1RvU2hvdywgLi4ucHJvcHN9KSA9PiAoXG4gIDx0Ym9keT5cbiAgICB7ZmllbGRzVG9TaG93Lm1hcChpdGVtID0+IChcbiAgICAgIDxFbnRyeUluZm9Sb3cga2V5PXtpdGVtLm5hbWV9IGl0ZW09e2l0ZW19IHsuLi5wcm9wc30gLz5cbiAgICApKX1cbiAgPC90Ym9keT5cbik7XG5cbmV4cG9ydCB0eXBlIEVudHJ5SW5mb1Jvd1Byb3BzID0ge1xuICBkYXRhOiBMYXllckhvdmVyUHJvcFsnZGF0YSddO1xuICBmaWVsZHM6IEZpZWxkW107XG4gIGxheWVyOiBMYXllcjtcbiAgcHJpbWFyeURhdGE/OiBMYXllckhvdmVyUHJvcFsncHJpbWFyeURhdGEnXTtcbiAgY29tcGFyZVR5cGU/OiBDb21wYXJlVHlwZTtcbiAgY3VycmVudFRpbWU/OiBWaXNTdGF0ZVsnYW5pbWF0aW9uQ29uZmlnJ11bJ2N1cnJlbnRUaW1lJ107XG4gIGl0ZW06IFRvb2x0aXBGaWVsZDtcbn07XG5cbmNvbnN0IEVudHJ5SW5mb1JvdzogUmVhY3QuRkM8RW50cnlJbmZvUm93UHJvcHM+ID0gKHtcbiAgbGF5ZXIsXG4gIGl0ZW0sXG4gIGZpZWxkcyxcbiAgZGF0YSxcbiAgcHJpbWFyeURhdGEsXG4gIGNvbXBhcmVUeXBlLFxuICBjdXJyZW50VGltZVxufSkgPT4ge1xuICBjb25zdCBmaWVsZElkeCA9IGZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGl0ZW0ubmFtZSk7XG4gIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBmaWVsZCA9IGZpZWxkc1tmaWVsZElkeF07XG4gIGNvbnN0IGZpZWxkVmFsdWVBY2Nlc3NvciA9IGxheWVyLmFjY2Vzc1ZTRmllbGRWYWx1ZShmaWVsZCwgY3VycmVudFRpbWUpO1xuICBjb25zdCB2YWx1ZSA9IGZpZWxkVmFsdWVBY2Nlc3NvcihmaWVsZCwgZGF0YSBpbnN0YW5jZW9mIERhdGFSb3cgPyB7aW5kZXg6IGRhdGEuX3Jvd0luZGV4fSA6IGRhdGEpO1xuICBjb25zdCBwcmltYXJ5VmFsdWUgPSBwcmltYXJ5RGF0YVxuICAgID8gZmllbGRWYWx1ZUFjY2Vzc29yKFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgcHJpbWFyeURhdGEgaW5zdGFuY2VvZiBEYXRhUm93ID8ge2luZGV4OiBwcmltYXJ5RGF0YS5fcm93SW5kZXh9IDogcHJpbWFyeURhdGFcbiAgICAgIClcbiAgICA6IG51bGw7XG4gIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGdldFRvb2x0aXBEaXNwbGF5VmFsdWUoe2l0ZW0sIGZpZWxkLCB2YWx1ZX0pO1xuXG4gIGNvbnN0IGRpc3BsYXlEZWx0YVZhbHVlID0gcHJpbWFyeURhdGFcbiAgICA/IGdldFRvb2x0aXBEaXNwbGF5RGVsdGFWYWx1ZSh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcHJpbWFyeVZhbHVlLFxuICAgICAgICBjb21wYXJlVHlwZVxuICAgICAgfSlcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8Um93XG4gICAgICBuYW1lPXtmaWVsZC5kaXNwbGF5TmFtZSB8fCBmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e2Rpc3BsYXlWYWx1ZX1cbiAgICAgIGRlbHRhVmFsdWU9e2Rpc3BsYXlEZWx0YVZhbHVlfVxuICAgIC8+XG4gICk7XG59O1xuXG4vLyBUT0RPOiBzdXBwb3J0aW5nIGNvbXBhcmF0aXZlIHZhbHVlIGZvciBhZ2dyZWdhdGVkIGNlbGxzIGFzIHdlbGxcbmNvbnN0IENlbGxJbmZvID0gKHtcbiAgZmllbGRzVG9TaG93LFxuICBkYXRhLFxuICBsYXllclxufToge1xuICBkYXRhOiBBZ2dyZWdhdGlvbkxheWVySG92ZXJEYXRhO1xuICBmaWVsZHNUb1Nob3c6IFRvb2x0aXBGaWVsZFtdO1xuICBsYXllcjogTGF5ZXI7XG59KSA9PiB7XG4gIGNvbnN0IHtjb2xvckZpZWxkLCBzaXplRmllbGR9ID0gbGF5ZXIuY29uZmlnIGFzIGFueTtcblxuICBjb25zdCBjb2xvclZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGNvbG9yRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuY29sb3IpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBmaWVsZHNUb1Nob3cuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lID09PSBjb2xvckZpZWxkLm5hbWUpO1xuICAgICAgcmV0dXJuIGdldFRvb2x0aXBEaXNwbGF5VmFsdWUoe2l0ZW0sIGZpZWxkOiBjb2xvckZpZWxkLCB2YWx1ZTogZGF0YS5jb2xvclZhbHVlfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LCBbZmllbGRzVG9TaG93LCBjb2xvckZpZWxkLCBsYXllciwgZGF0YS5jb2xvclZhbHVlXSk7XG5cbiAgY29uc3QgZWxldmF0aW9uVmFsdWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoc2l6ZUZpZWxkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLnNpemUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBmaWVsZHNUb1Nob3cuZmluZChmaWVsZCA9PiBmaWVsZC5uYW1lID09PSBzaXplRmllbGQubmFtZSk7XG4gICAgICByZXR1cm4gZ2V0VG9vbHRpcERpc3BsYXlWYWx1ZSh7aXRlbSwgZmllbGQ6IHNpemVGaWVsZCwgdmFsdWU6IGRhdGEuZWxldmF0aW9uVmFsdWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIFtmaWVsZHNUb1Nob3csIHNpemVGaWVsZCwgbGF5ZXIsIGRhdGEuZWxldmF0aW9uVmFsdWVdKTtcblxuICBjb25zdCBhZ2dyZWdhdGVkRGF0YSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChkYXRhLmFnZ3JlZ2F0ZWREYXRhICYmIGZpZWxkc1RvU2hvdykge1xuICAgICAgcmV0dXJuIGZpZWxkc1RvU2hvdy5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YUZvckZpZWxkID0gZGF0YS5hZ2dyZWdhdGVkRGF0YT8uW2ZpZWxkLm5hbWVdO1xuICAgICAgICBpZiAoZGF0YUZvckZpZWxkPy5tZWFzdXJlICYmIGZpZWxkLm5hbWUgIT09IGNvbG9yRmllbGQ/Lm5hbWUpIHtcbiAgICAgICAgICBhY2MucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBgJHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZGF0YUZvckZpZWxkLm1lYXN1cmUpfSBvZiAke2ZpZWxkLm5hbWV9YCxcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhRm9yRmllbGQudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgW10gYXMge25hbWU6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmd9W10pO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0sIFtkYXRhLmFnZ3JlZ2F0ZWREYXRhLCBmaWVsZHNUb1Nob3csIGNvbG9yRmllbGQ/Lm5hbWVdKTtcblxuICBjb25zdCBjb2xvck1lYXN1cmUgPSBsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oJ2NvbG9yJykubWVhc3VyZTtcbiAgY29uc3Qgc2l6ZU1lYXN1cmUgPSBsYXllci5nZXRWaXN1YWxDaGFubmVsRGVzY3JpcHRpb24oJ3NpemUnKS5tZWFzdXJlO1xuICByZXR1cm4gKFxuICAgIDx0Ym9keT5cbiAgICAgIDxSb3cgbmFtZT17J3RvdGFsIHBvaW50cyd9IGtleT1cImNvdW50XCIgdmFsdWU9e1N0cmluZyhkYXRhLnBvaW50cyAmJiBkYXRhLnBvaW50cy5sZW5ndGgpfSAvPlxuICAgICAge2NvbG9yRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuY29sb3IgJiYgY29sb3JNZWFzdXJlID8gKFxuICAgICAgICA8Um93IG5hbWU9e2NvbG9yTWVhc3VyZX0ga2V5PVwiY29sb3JcIiB2YWx1ZT17Y29sb3JWYWx1ZSB8fCAnTi9BJ30gLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge3NpemVGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5zaXplICYmIHNpemVNZWFzdXJlID8gKFxuICAgICAgICA8Um93IG5hbWU9e3NpemVNZWFzdXJlfSBrZXk9XCJzaXplXCIgdmFsdWU9e2VsZXZhdGlvblZhbHVlIHx8ICdOL0EnfSAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7YWdncmVnYXRlZERhdGEubWFwKChkYXRhRm9yRmllbGQsIGlkeCkgPT4gKFxuICAgICAgICA8Um93IG5hbWU9e2RhdGFGb3JGaWVsZC5uYW1lfSBrZXk9e2BkYXRhXyR7aWR4fWB9IHZhbHVlPXtkYXRhRm9yRmllbGQudmFsdWUgfHwgJ04vQSd9IC8+XG4gICAgICApKX1cbiAgICA8L3Rib2R5PlxuICApO1xufTtcblxuY29uc3QgTGF5ZXJIb3ZlckluZm9GYWN0b3J5ID0gKCkgPT4ge1xuICBjb25zdCBMYXllckhvdmVySW5mbyA9IHByb3BzID0+IHtcbiAgICBjb25zdCB7ZGF0YSwgbGF5ZXJ9ID0gcHJvcHM7XG4gICAgY29uc3QgaW50bCA9IHVzZUludGwoKTtcbiAgICBpZiAoIWRhdGEgfHwgIWxheWVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNGaWVsZHNUb1Nob3cgPVxuICAgICAgKGRhdGEuZmllbGRWYWx1ZXMgJiYgT2JqZWN0LmtleXMoZGF0YS5maWVsZFZhbHVlcykubGVuZ3RoID4gMCkgfHxcbiAgICAgIChwcm9wcy5maWVsZHNUb1Nob3cgJiYgcHJvcHMuZmllbGRzVG9TaG93Lmxlbmd0aCA+IDApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWFwLXBvcG92ZXJfX2xheWVyLWluZm9cIj5cbiAgICAgICAgPFN0eWxlZExheWVyTmFtZSBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fbGF5ZXItbmFtZVwiPlxuICAgICAgICAgIDxMYXllcnMgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAge3Byb3BzLmxheWVyLmNvbmZpZy5sYWJlbH1cbiAgICAgICAgPC9TdHlsZWRMYXllck5hbWU+XG4gICAgICAgIHtoYXNGaWVsZHNUb1Nob3cgJiYgPFN0eWxlZERpdmlkZXIgLz59XG4gICAgICAgIDxTdHlsZWRUYWJsZT5cbiAgICAgICAgICB7ZGF0YS5maWVsZFZhbHVlcyA/IChcbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAge2RhdGEuZmllbGRWYWx1ZXMubWFwKCh7bGFiZWxNZXNzYWdlLCB2YWx1ZX0sIGkpID0+IChcbiAgICAgICAgICAgICAgICA8Um93IGtleT17aX0gbmFtZT17aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogbGFiZWxNZXNzYWdlfSl9IHZhbHVlPXt2YWx1ZX0gLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICkgOiBwcm9wcy5sYXllci5pc0FnZ3JlZ2F0ZWQgPyAoXG4gICAgICAgICAgICA8Q2VsbEluZm8gey4uLnByb3BzfSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8RW50cnlJbmZvIHsuLi5wcm9wc30gLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1N0eWxlZFRhYmxlPlxuICAgICAgICB7aGFzRmllbGRzVG9TaG93ICYmIDxTdHlsZWREaXZpZGVyIC8+fVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcblxuICBMYXllckhvdmVySW5mby5wcm9wVHlwZXMgPSB7XG4gICAgZmllbGRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICBmaWVsZHNUb1Nob3c6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgIGxheWVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRhdGE6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLCBQcm9wVHlwZXMub2JqZWN0XSlcbiAgfTtcbiAgcmV0dXJuIExheWVySG92ZXJJbmZvO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXJIb3ZlckluZm9GYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxrQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sWUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sTUFBQSxHQUFBUCxPQUFBO0FBRUEsSUFBQVEsU0FBQSxHQUFBUixPQUFBO0FBTUEsSUFBQVMsVUFBQSxHQUFBVCxPQUFBO0FBQW1DLElBQUFVLFNBQUE7QUFBQSxJQUFBQyxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBbEJuQztBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFB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
;