UNPKG

kepler.gl

Version:

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

245 lines (242 loc) 41.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof3 = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.StyledLayerName = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 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("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _styledComponents2 = require("../common/styled-components"); var _icons = require("../common/icons"); var _propTypes = _interopRequireDefault(require("prop-types")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/common-utils/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _src3 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/reducers/src"); var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/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" != _typeof3(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, _src.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 _src2.DataRow ? { index: data._rowIndex } : data); // Handle WMS layer data in comparison mode - WMS layers don't have comparable field data var primaryValue = null; var displayDeltaValue = null; if (primaryData) { try { // Only calculate primary value if primaryData has a compatible structure if (primaryData instanceof _src2.DataRow || primaryData && (0, _typeof2["default"])(primaryData) === 'object' && 'index' in primaryData) { primaryValue = fieldValueAccessor(field, primaryData instanceof _src2.DataRow ? { index: primaryData._rowIndex } : primaryData); displayDeltaValue = (0, _src3.getTooltipDisplayDeltaValue)({ field: field, value: value, primaryValue: primaryValue, compareType: compareType }); } } catch (error) { // If there's an error accessing primaryData (e.g., WMS layer data), skip comparison primaryValue = null; } } var displayValue = (0, _src3.getTooltipDisplayValue)({ item: item, field: field, value: value }); 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, _src3.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, _src3.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, _src2.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 || data.wmsFeatureData && data.wmsFeatureData.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.wmsFeatureData ? /*#__PURE__*/_react["default"].createElement("tbody", null, data.wmsFeatureData.map(function (_ref6, i) { var name = _ref6.name, value = _ref6.value; return /*#__PURE__*/_react["default"].createElement(Row, { key: i, name: name, value: value }); })) : data.fieldValues ? /*#__PURE__*/_react["default"].createElement("tbody", null, data.fieldValues.map(function (_ref7, i) { var labelMessage = _ref7.labelMessage, value = _ref7.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfaWNvbnMiLCJfcHJvcFR5cGVzIiwiX3NyYyIsIl9zcmMyIiwiX3NyYzMiLCJfcmVhY3RJbnRsIiwiX2V4Y2x1ZGVkIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YzIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU3R5bGVkTGF5ZXJOYW1lIiwiZXhwb3J0cyIsInN0eWxlZCIsIkNlbnRlckZsZXhib3giLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJ0ZXh0Q29sb3JIbCIsIlN0eWxlZFRhYmxlIiwidGFibGUiLCJub3RpZmljYXRpb25Db2xvcnMiLCJzdWNjZXNzIiwibmVnYXRpdmVCdG5BY3RCZ2QiLCJTdHlsZWREaXZpZGVyIiwiZGl2IiwicGFuZWxCb3JkZXJDb2xvciIsIlJvdyIsIl9yZWYiLCJuYW1lIiwidmFsdWUiLCJkZWx0YVZhbHVlIiwidXJsIiwibWF0Y2giLCJhc0ltZyIsInRlc3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwia2V5IiwicmVwbGFjZSIsInNyYyIsInRhcmdldCIsInJlbCIsImhyZWYiLCJGcmFnbWVudCIsIm5vdE51bGxvclVuZGVmaW5lZCIsImNvbmNhdCIsInRvU3RyaW5nIiwiY2hhckF0IiwiRW50cnlJbmZvIiwiX3JlZjIiLCJmaWVsZHNUb1Nob3ciLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwibWFwIiwiaXRlbSIsIkVudHJ5SW5mb1JvdyIsIl9leHRlbmRzMiIsIl9yZWYzIiwibGF5ZXIiLCJmaWVsZHMiLCJkYXRhIiwicHJpbWFyeURhdGEiLCJjb21wYXJlVHlwZSIsImN1cnJlbnRUaW1lIiwiZmllbGRJZHgiLCJmaW5kSW5kZXgiLCJmIiwiZmllbGQiLCJmaWVsZFZhbHVlQWNjZXNzb3IiLCJhY2Nlc3NWU0ZpZWxkVmFsdWUiLCJEYXRhUm93IiwiaW5kZXgiLCJfcm93SW5kZXgiLCJwcmltYXJ5VmFsdWUiLCJkaXNwbGF5RGVsdGFWYWx1ZSIsIl90eXBlb2YyIiwiZ2V0VG9vbHRpcERpc3BsYXlEZWx0YVZhbHVlIiwiZXJyb3IiLCJkaXNwbGF5VmFsdWUiLCJnZXRUb29sdGlwRGlzcGxheVZhbHVlIiwiZGlzcGxheU5hbWUiLCJDZWxsSW5mbyIsIl9yZWY0IiwiX3JlZjUiLCJjb25maWciLCJjb2xvckZpZWxkIiwic2l6ZUZpZWxkIiwiY29sb3JWYWx1ZSIsInVzZU1lbW8iLCJ2aXN1YWxDaGFubmVscyIsImNvbG9yIiwiZmluZCIsImVsZXZhdGlvblZhbHVlIiwic2l6ZSIsImFnZ3JlZ2F0ZWREYXRhIiwicmVkdWNlIiwiYWNjIiwiX2RhdGEkYWdncmVnYXRlZERhdGEiLCJkYXRhRm9yRmllbGQiLCJtZWFzdXJlIiwicHVzaCIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNvbG9yTWVhc3VyZSIsImdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbiIsInNpemVNZWFzdXJlIiwiU3RyaW5nIiwicG9pbnRzIiwibGVuZ3RoIiwiaWR4IiwiTGF5ZXJIb3ZlckluZm9GYWN0b3J5IiwiTGF5ZXJIb3ZlckluZm8iLCJpbnRsIiwidXNlSW50bCIsImhhc0ZpZWxkc1RvU2hvdyIsImZpZWxkVmFsdWVzIiwia2V5cyIsIndtc0ZlYXR1cmVEYXRhIiwiTGF5ZXJzIiwiaGVpZ2h0IiwibGFiZWwiLCJfcmVmNiIsIl9yZWY3IiwibGFiZWxNZXNzYWdlIiwiZm9ybWF0TWVzc2FnZSIsImlkIiwiaXNBZ2dyZWdhdGVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYXJyYXlPZiIsImFueSIsIm9iamVjdCIsIm9uZU9mVHlwZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL21hcC9sYXllci1ob3Zlci1pbmZvLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Q29tcGFyZVR5cGUsIEZpZWxkLCBNZXJnZSwgVG9vbHRpcEZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7Q2VudGVyRmxleGJveH0gZnJvbSAnLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7TGF5ZXJzfSBmcm9tICcuLi9jb21tb24vaWNvbnMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7bm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0RhdGFSb3d9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtcbiAgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSxcbiAgTGF5ZXJIb3ZlclByb3AsXG4gIGdldFRvb2x0aXBEaXNwbGF5RGVsdGFWYWx1ZSxcbiAgZ2V0VG9vbHRpcERpc3BsYXlWYWx1ZVxufSBmcm9tICdAa2VwbGVyLmdsL3JlZHVjZXJzJztcbmltcG9ydCB7dXNlSW50bH0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtjYXBpdGFsaXplRmlyc3RMZXR0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgU3R5bGVkTGF5ZXJOYW1lID0gc3R5bGVkKENlbnRlckZsZXhib3gpYFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuNDNweDtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG5cbiAgc3ZnIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkVGFibGUgPSBzdHlsZWQudGFibGVgXG4gICYgLnJvd19fZGVsdGEtdmFsdWUge1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XG5cbiAgICAmLnBvc2l0aXZlIHtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm5vdGlmaWNhdGlvbkNvbG9ycy5zdWNjZXNzfTtcbiAgICB9XG5cbiAgICAmLm5lZ2F0aXZlIHtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm5lZ2F0aXZlQnRuQWN0QmdkfTtcbiAgICB9XG4gIH1cbiAgJiAucm93X192YWx1ZSxcbiAgJiAucm93X19uYW1lIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBuby13cmFwO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWREaXZpZGVyID0gc3R5bGVkLmRpdmBcbiAgLy8gb2Zmc2V0IGRpdmlkZXIgdG8gcmVhY2ggcG9wb3ZlciBlZGdlXG4gIG1hcmdpbi1sZWZ0OiAtMTRweDtcbiAgbWFyZ2luLXJpZ2h0OiAtMTRweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCb3JkZXJDb2xvcn07XG5gO1xuXG5pbnRlcmZhY2UgUm93UHJvcHMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGRlbHRhVmFsdWU/OiBzdHJpbmcgfCBudWxsO1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFJvdzogUmVhY3QuRkM8Um93UHJvcHM+ID0gKHtuYW1lLCB2YWx1ZSwgZGVsdGFWYWx1ZSwgdXJsfSkgPT4ge1xuICAvLyBTZXQgJ3VybCcgdG8gJ3ZhbHVlJyBpZiBpdCBsb29rcyBsaWtlIGEgdXJsXG4gIGlmICghdXJsICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubWF0Y2goL15odHRwLykpIHtcbiAgICB1cmwgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGFzSW1nID0gLzxpbWc+Ly50ZXN0KG5hbWUpO1xuICByZXR1cm4gKFxuICAgIDx0ciBjbGFzc05hbWU9XCJsYXllci1ob3Zlci1pbmZvX19yb3dcIiBrZXk9e25hbWV9PlxuICAgICAgPHRkIGNsYXNzTmFtZT1cInJvd19fbmFtZVwiPnthc0ltZyA/IG5hbWUucmVwbGFjZSgnPGltZz4nLCAnJykgOiBuYW1lfTwvdGQ+XG4gICAgICA8dGQgY2xhc3NOYW1lPVwicm93X192YWx1ZVwiPlxuICAgICAgICB7YXNJbWcgPyAoXG4gICAgICAgICAgPGltZyBzcmM9e3ZhbHVlfSAvPlxuICAgICAgICApIDogdXJsID8gKFxuICAgICAgICAgIDxhIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBocmVmPXt1cmx9PlxuICAgICAgICAgICAge3ZhbHVlfVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPHNwYW4+e3ZhbHVlfTwvc3Bhbj5cbiAgICAgICAgICAgIHtub3ROdWxsb3JVbmRlZmluZWQoZGVsdGFWYWx1ZSkgPyAoXG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcm93X19kZWx0YS12YWx1ZSAke1xuICAgICAgICAgICAgICAgICAgZGVsdGFWYWx1ZT8udG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICcrJyA/ICdwb3NpdGl2ZScgOiAnbmVnYXRpdmUnXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGVsdGFWYWx1ZX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBFbnRyeUluZm9Qcm9wcyA9IE1lcmdlPExheWVySG92ZXJQcm9wLCB7ZmllbGRzVG9TaG93OiBUb29sdGlwRmllbGRbXX0+O1xuXG5jb25zdCBFbnRyeUluZm86IFJlYWN0LkZDPEVudHJ5SW5mb1Byb3BzPiA9ICh7ZmllbGRzVG9TaG93LCAuLi5wcm9wc30pID0+IChcbiAgPHRib2R5PlxuICAgIHtmaWVsZHNUb1Nob3cubWFwKGl0ZW0gPT4gKFxuICAgICAgPEVudHJ5SW5mb1JvdyBrZXk9e2l0ZW0ubmFtZX0gaXRlbT17aXRlbX0gey4uLnByb3BzfSAvPlxuICAgICkpfVxuICA8L3Rib2R5PlxuKTtcblxuZXhwb3J0IHR5cGUgRW50cnlJbmZvUm93UHJvcHMgPSB7XG4gIGRhdGE6IExheWVySG92ZXJQcm9wWydkYXRhJ107XG4gIGZpZWxkczogRmllbGRbXTtcbiAgbGF5ZXI6IExheWVyO1xuICBwcmltYXJ5RGF0YT86IExheWVySG92ZXJQcm9wWydwcmltYXJ5RGF0YSddO1xuICBjb21wYXJlVHlwZT86IENvbXBhcmVUeXBlO1xuICBjdXJyZW50VGltZT86IFZpc1N0YXRlWydhbmltYXRpb25Db25maWcnXVsnY3VycmVudFRpbWUnXTtcbiAgaXRlbTogVG9vbHRpcEZpZWxkO1xufTtcblxuY29uc3QgRW50cnlJbmZvUm93OiBSZWFjdC5GQzxFbnRyeUluZm9Sb3dQcm9wcz4gPSAoe1xuICBsYXllcixcbiAgaXRlbSxcbiAgZmllbGRzLFxuICBkYXRhLFxuICBwcmltYXJ5RGF0YSxcbiAgY29tcGFyZVR5cGUsXG4gIGN1cnJlbnRUaW1lXG59KSA9PiB7XG4gIGNvbnN0IGZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gaXRlbS5uYW1lKTtcbiAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGZpZWxkID0gZmllbGRzW2ZpZWxkSWR4XTtcbiAgY29uc3QgZmllbGRWYWx1ZUFjY2Vzc29yID0gbGF5ZXIuYWNjZXNzVlNGaWVsZFZhbHVlKGZpZWxkLCBjdXJyZW50VGltZSk7XG4gIGNvbnN0IHZhbHVlID0gZmllbGRWYWx1ZUFjY2Vzc29yKGZpZWxkLCBkYXRhIGluc3RhbmNlb2YgRGF0YVJvdyA/IHtpbmRleDogZGF0YS5fcm93SW5kZXh9IDogZGF0YSk7XG5cbiAgLy8gSGFuZGxlIFdNUyBsYXllciBkYXRhIGluIGNvbXBhcmlzb24gbW9kZSAtIFdNUyBsYXllcnMgZG9uJ3QgaGF2ZSBjb21wYXJhYmxlIGZpZWxkIGRhdGFcbiAgbGV0IHByaW1hcnlWYWx1ZSA9IG51bGw7XG4gIGxldCBkaXNwbGF5RGVsdGFWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgaWYgKHByaW1hcnlEYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9ubHkgY2FsY3VsYXRlIHByaW1hcnkgdmFsdWUgaWYgcHJpbWFyeURhdGEgaGFzIGEgY29tcGF0aWJsZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChcbiAgICAgICAgcHJpbWFyeURhdGEgaW5zdGFuY2VvZiBEYXRhUm93IHx8XG4gICAgICAgIChwcmltYXJ5RGF0YSAmJiB0eXBlb2YgcHJpbWFyeURhdGEgPT09ICdvYmplY3QnICYmICdpbmRleCcgaW4gcHJpbWFyeURhdGEpXG4gICAgICApIHtcbiAgICAgICAgcHJpbWFyeVZhbHVlID0gZmllbGRWYWx1ZUFjY2Vzc29yKFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHByaW1hcnlEYXRhIGluc3RhbmNlb2YgRGF0YVJvdyA/IHtpbmRleDogcHJpbWFyeURhdGEuX3Jvd0luZGV4fSA6IHByaW1hcnlEYXRhXG4gICAgICAgICk7XG5cbiAgICAgICAgZGlzcGxheURlbHRhVmFsdWUgPSBnZXRUb29sdGlwRGlzcGxheURlbHRhVmFsdWUoe1xuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHByaW1hcnlWYWx1ZSxcbiAgICAgICAgICBjb21wYXJlVHlwZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgdGhlcmUncyBhbiBlcnJvciBhY2Nlc3NpbmcgcHJpbWFyeURhdGEgKGUuZy4sIFdNUyBsYXllciBkYXRhKSwgc2tpcCBjb21wYXJpc29uXG4gICAgICBwcmltYXJ5VmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGdldFRvb2x0aXBEaXNwbGF5VmFsdWUoe2l0ZW0sIGZpZWxkLCB2YWx1ZX0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJvd1xuICAgICAgbmFtZT17ZmllbGQuZGlzcGxheU5hbWUgfHwgZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXtkaXNwbGF5VmFsdWV9XG4gICAgICBkZWx0YVZhbHVlPXtkaXNwbGF5RGVsdGFWYWx1ZX1cbiAgICAvPlxuICApO1xufTtcblxuLy8gVE9ETzogc3VwcG9ydGluZyBjb21wYXJhdGl2ZSB2YWx1ZSBmb3IgYWdncmVnYXRlZCBjZWxscyBhcyB3ZWxsXG5jb25zdCBDZWxsSW5mbyA9ICh7XG4gIGZpZWxkc1RvU2hvdyxcbiAgZGF0YSxcbiAgbGF5ZXJcbn06IHtcbiAgZGF0YTogQWdncmVnYXRpb25MYXllckhvdmVyRGF0YTtcbiAgZmllbGRzVG9TaG93OiBUb29sdGlwRmllbGRbXTtcbiAgbGF5ZXI6IExheWVyO1xufSkgPT4ge1xuICBjb25zdCB7Y29sb3JGaWVsZCwgc2l6ZUZpZWxkfSA9IGxheWVyLmNvbmZpZyBhcyBhbnk7XG5cbiAgY29uc3QgY29sb3JWYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChjb2xvckZpZWxkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLmNvbG9yKSB7XG4gICAgICBjb25zdCBpdGVtID0gZmllbGRzVG9TaG93LmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gY29sb3JGaWVsZC5uYW1lKTtcbiAgICAgIHJldHVybiBnZXRUb29sdGlwRGlzcGxheVZhbHVlKHtpdGVtLCBmaWVsZDogY29sb3JGaWVsZCwgdmFsdWU6IGRhdGEuY29sb3JWYWx1ZX0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW2ZpZWxkc1RvU2hvdywgY29sb3JGaWVsZCwgbGF5ZXIsIGRhdGEuY29sb3JWYWx1ZV0pO1xuXG4gIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHNpemVGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5zaXplKSB7XG4gICAgICBjb25zdCBpdGVtID0gZmllbGRzVG9TaG93LmZpbmQoZmllbGQgPT4gZmllbGQubmFtZSA9PT0gc2l6ZUZpZWxkLm5hbWUpO1xuICAgICAgcmV0dXJuIGdldFRvb2x0aXBEaXNwbGF5VmFsdWUoe2l0ZW0sIGZpZWxkOiBzaXplRmllbGQsIHZhbHVlOiBkYXRhLmVsZXZhdGlvblZhbHVlfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LCBbZmllbGRzVG9TaG93LCBzaXplRmllbGQsIGxheWVyLCBkYXRhLmVsZXZhdGlvblZhbHVlXSk7XG5cbiAgY29uc3QgYWdncmVnYXRlZERhdGEgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGF0YS5hZ2dyZWdhdGVkRGF0YSAmJiBmaWVsZHNUb1Nob3cpIHtcbiAgICAgIHJldHVybiBmaWVsZHNUb1Nob3cucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFGb3JGaWVsZCA9IGRhdGEuYWdncmVnYXRlZERhdGE/LltmaWVsZC5uYW1lXTtcbiAgICAgICAgaWYgKGRhdGFGb3JGaWVsZD8ubWVhc3VyZSAmJiBmaWVsZC5uYW1lICE9PSBjb2xvckZpZWxkPy5uYW1lKSB7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogYCR7Y2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGRhdGFGb3JGaWVsZC5tZWFzdXJlKX0gb2YgJHtmaWVsZC5uYW1lfWAsXG4gICAgICAgICAgICB2YWx1ZTogZGF0YUZvckZpZWxkLnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdIGFzIHtuYW1lOiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nfVtdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LCBbZGF0YS5hZ2dyZWdhdGVkRGF0YSwgZmllbGRzVG9TaG93LCBjb2xvckZpZWxkPy5uYW1lXSk7XG5cbiAgY29uc3QgY29sb3JNZWFzdXJlID0gbGF5ZXIuZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKCdjb2xvcicpLm1lYXN1cmU7XG4gIGNvbnN0IHNpemVNZWFzdXJlID0gbGF5ZXIuZ2V0VmlzdWFsQ2hhbm5lbERlc2NyaXB0aW9uKCdzaXplJykubWVhc3VyZTtcbiAgcmV0dXJuIChcbiAgICA8dGJvZHk+XG4gICAgICA8Um93IG5hbWU9eyd0b3RhbCBwb2ludHMnfSBrZXk9XCJjb3VudFwiIHZhbHVlPXtTdHJpbmcoZGF0YS5wb2ludHMgJiYgZGF0YS5wb2ludHMubGVuZ3RoKX0gLz5cbiAgICAgIHtjb2xvckZpZWxkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLmNvbG9yICYmIGNvbG9yTWVhc3VyZSA/IChcbiAgICAgICAgPFJvdyBuYW1lPXtjb2xvck1lYXN1cmV9IGtleT1cImNvbG9yXCIgdmFsdWU9e2NvbG9yVmFsdWUgfHwgJ04vQSd9IC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtzaXplRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSAmJiBzaXplTWVhc3VyZSA/IChcbiAgICAgICAgPFJvdyBuYW1lPXtzaXplTWVhc3VyZX0ga2V5PVwic2l6ZVwiIHZhbHVlPXtlbGV2YXRpb25WYWx1ZSB8fCAnTi9BJ30gLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge2FnZ3JlZ2F0ZWREYXRhLm1hcCgoZGF0YUZvckZpZWxkLCBpZHgpID0+IChcbiAgICAgICAgPFJvdyBuYW1lPXtkYXRhRm9yRmllbGQubmFtZX0ga2V5PXtgZGF0YV8ke2lkeH1gfSB2YWx1ZT17ZGF0YUZvckZpZWxkLnZhbHVlIHx8ICdOL0EnfSAvPlxuICAgICAgKSl9XG4gICAgPC90Ym9keT5cbiAgKTtcbn07XG5cbmNvbnN0IExheWVySG92ZXJJbmZvRmFjdG9yeSA9ICgpID0+IHtcbiAgY29uc3QgTGF5ZXJIb3ZlckluZm8gPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge2RhdGEsIGxheWVyfSA9IHByb3BzO1xuICAgIGNvbnN0IGludGwgPSB1c2VJbnRsKCk7XG4gICAgaWYgKCFkYXRhIHx8ICFsYXllcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRmllbGRzVG9TaG93ID1cbiAgICAgIChkYXRhLmZpZWxkVmFsdWVzICYmIE9iamVjdC5rZXlzKGRhdGEuZmllbGRWYWx1ZXMpLmxlbmd0aCA+IDApIHx8XG4gICAgICAoZGF0YS53bXNGZWF0dXJlRGF0YSAmJiBkYXRhLndtc0ZlYXR1cmVEYXRhLmxlbmd0aCA+IDApIHx8XG4gICAgICAocHJvcHMuZmllbGRzVG9TaG93ICYmIHByb3BzLmZpZWxkc1RvU2hvdy5sZW5ndGggPiAwKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyX19sYXllci1pbmZvXCI+XG4gICAgICAgIDxTdHlsZWRMYXllck5hbWUgY2xhc3NOYW1lPVwibWFwLXBvcG92ZXJfX2xheWVyLW5hbWVcIj5cbiAgICAgICAgICA8TGF5ZXJzIGhlaWdodD1cIjEycHhcIiAvPlxuICAgICAgICAgIHtwcm9wcy5sYXllci5jb25maWcubGFiZWx9XG4gICAgICAgIDwvU3R5bGVkTGF5ZXJOYW1lPlxuICAgICAgICB7aGFzRmllbGRzVG9TaG93ICYmIDxTdHlsZWREaXZpZGVyIC8+fVxuICAgICAgICA8U3R5bGVkVGFibGU+XG4gICAgICAgICAge2RhdGEud21zRmVhdHVyZURhdGEgPyAoXG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgIHtkYXRhLndtc0ZlYXR1cmVEYXRhLm1hcCgoe25hbWUsIHZhbHVlfSwgaSkgPT4gKFxuICAgICAgICAgICAgICAgIDxSb3cga2V5PXtpfSBuYW1lPXtuYW1lfSB2YWx1ZT17dmFsdWV9IC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICApIDogZGF0YS5maWVsZFZhbHVlcyA/IChcbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAge2RhdGEuZmllbGRWYWx1ZXMubWFwKCh7bGFiZWxNZXNzYWdlLCB2YWx1ZX0sIGkpID0+IChcbiAgICAgICAgICAgICAgICA8Um93IGtleT17aX0gbmFtZT17aW50bC5mb3JtYXRNZXNzYWdlKHtpZDogbGFiZWxNZXNzYWdlfSl9IHZhbHVlPXt2YWx1ZX0gLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICkgOiBwcm9wcy5sYXllci5pc0FnZ3JlZ2F0ZWQgPyAoXG4gICAgICAgICAgICA8Q2VsbEluZm8gey4uLnByb3BzfSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8RW50cnlJbmZvIHsuLi5wcm9wc30gLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1N0eWxlZFRhYmxlPlxuICAgICAgICB7aGFzRmllbGRzVG9TaG93ICYmIDxTdHlsZWREaXZpZGVyIC8+fVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcblxuICBMYXllckhvdmVySW5mby5wcm9wVHlwZXMgPSB7XG4gICAgZmllbGRzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICBmaWVsZHNUb1Nob3c6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLFxuICAgIGxheWVyOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGRhdGE6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLCBQcm9wVHlwZXMub2JqZWN0XSlcbiAgfTtcbiAgcmV0dXJuIExheWVySG92ZXJJbmZvO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGF5ZXJIb3ZlckluZm9GYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUcsa0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLElBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLEtBQUEsR0FBQVAsT0FBQTtBQUVBLElBQUFRLEtBQUEsR0FBQVIsT0FBQTtBQU1BLElBQUFTLFVBQUEsR0FBQVQsT0FBQTtBQUFtQyxJQUFBVSxTQUFBO0FBQUEsSUFBQUMsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWxCbkM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFB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