UNPKG

kepler.gl

Version:

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

250 lines (247 loc) 42.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("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _truncate = _interopRequireDefault(require("lodash/truncate")); 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" != _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__name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n & .row__value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: pre-line;\n max-width: 250px;\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 TOOLTIP_VALUE_MAX_LENGTH = 256; 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 displayValue = typeof value === 'string' && value.length > TOOLTIP_VALUE_MAX_LENGTH ? (0, _truncate["default"])(value, { length: TOOLTIP_VALUE_MAX_LENGTH }) : 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 }, displayValue) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", null, displayValue), (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); // 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 _utils.DataRow || primaryData && (0, _typeof2["default"])(primaryData) === 'object' && 'index' in primaryData) { primaryValue = fieldValueAccessor(field, primaryData instanceof _utils.DataRow ? { index: primaryData._rowIndex } : primaryData); displayDeltaValue = (0, _reducers.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, _reducers.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, _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 || 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdHJ1bmNhdGUiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfaWNvbnMiLCJfcHJvcFR5cGVzIiwiX2NvbW1vblV0aWxzIiwiX3V0aWxzIiwiX3JlZHVjZXJzIiwiX3JlYWN0SW50bCIsIl9leGNsdWRlZCIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mMyIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlN0eWxlZExheWVyTmFtZSIsImV4cG9ydHMiLCJzdHlsZWQiLCJDZW50ZXJGbGV4Ym94IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJwcm9wcyIsInRoZW1lIiwidGV4dENvbG9ySGwiLCJTdHlsZWRUYWJsZSIsInRhYmxlIiwibm90aWZpY2F0aW9uQ29sb3JzIiwic3VjY2VzcyIsIm5lZ2F0aXZlQnRuQWN0QmdkIiwiU3R5bGVkRGl2aWRlciIsImRpdiIsInBhbmVsQm9yZGVyQ29sb3IiLCJUT09MVElQX1ZBTFVFX01BWF9MRU5HVEgiLCJSb3ciLCJfcmVmIiwibmFtZSIsInZhbHVlIiwiZGVsdGFWYWx1ZSIsInVybCIsIm1hdGNoIiwiZGlzcGxheVZhbHVlIiwibGVuZ3RoIiwidHJ1bmNhdGUiLCJhc0ltZyIsInRlc3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwia2V5IiwicmVwbGFjZSIsInNyYyIsInRhcmdldCIsInJlbCIsImhyZWYiLCJGcmFnbWVudCIsIm5vdE51bGxvclVuZGVmaW5lZCIsImNvbmNhdCIsInRvU3RyaW5nIiwiY2hhckF0IiwiRW50cnlJbmZvIiwiX3JlZjIiLCJmaWVsZHNUb1Nob3ciLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwibWFwIiwiaXRlbSIsIkVudHJ5SW5mb1JvdyIsIl9leHRlbmRzMiIsIl9yZWYzIiwibGF5ZXIiLCJmaWVsZHMiLCJkYXRhIiwicHJpbWFyeURhdGEiLCJjb21wYXJlVHlwZSIsImN1cnJlbnRUaW1lIiwiZmllbGRJZHgiLCJmaW5kSW5kZXgiLCJmIiwiZmllbGQiLCJmaWVsZFZhbHVlQWNjZXNzb3IiLCJhY2Nlc3NWU0ZpZWxkVmFsdWUiLCJEYXRhUm93IiwiaW5kZXgiLCJfcm93SW5kZXgiLCJwcmltYXJ5VmFsdWUiLCJkaXNwbGF5RGVsdGFWYWx1ZSIsIl90eXBlb2YyIiwiZ2V0VG9vbHRpcERpc3BsYXlEZWx0YVZhbHVlIiwiZXJyb3IiLCJnZXRUb29sdGlwRGlzcGxheVZhbHVlIiwiZGlzcGxheU5hbWUiLCJDZWxsSW5mbyIsIl9yZWY0IiwiX3JlZjUiLCJjb25maWciLCJjb2xvckZpZWxkIiwic2l6ZUZpZWxkIiwiY29sb3JWYWx1ZSIsInVzZU1lbW8iLCJ2aXN1YWxDaGFubmVscyIsImNvbG9yIiwiZmluZCIsImVsZXZhdGlvblZhbHVlIiwic2l6ZSIsImFnZ3JlZ2F0ZWREYXRhIiwicmVkdWNlIiwiYWNjIiwiX2RhdGEkYWdncmVnYXRlZERhdGEiLCJkYXRhRm9yRmllbGQiLCJtZWFzdXJlIiwicHVzaCIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNvbG9yTWVhc3VyZSIsImdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbiIsInNpemVNZWFzdXJlIiwiU3RyaW5nIiwicG9pbnRzIiwiaWR4IiwiTGF5ZXJIb3ZlckluZm9GYWN0b3J5IiwiTGF5ZXJIb3ZlckluZm8iLCJpbnRsIiwidXNlSW50bCIsImhhc0ZpZWxkc1RvU2hvdyIsImZpZWxkVmFsdWVzIiwia2V5cyIsIndtc0ZlYXR1cmVEYXRhIiwiTGF5ZXJzIiwiaGVpZ2h0IiwibGFiZWwiLCJfcmVmNiIsIl9yZWY3IiwibGFiZWxNZXNzYWdlIiwiZm9ybWF0TWVzc2FnZSIsImlkIiwiaXNBZ2dyZWdhdGVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYXJyYXlPZiIsImFueSIsIm9iamVjdCIsIm9uZU9mVHlwZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC9sYXllci1ob3Zlci1pbmZvLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB0cnVuY2F0ZSBmcm9tICdsb2Rhc2gvdHJ1bmNhdGUnO1xuaW1wb3J0IHtDb21wYXJlVHlwZSwgRmllbGQsIE1lcmdlLCBUb29sdGlwRmllbGR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtDZW50ZXJGbGV4Ym94fSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtMYXllcnN9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHtub3ROdWxsb3JVbmRlZmluZWR9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7RGF0YVJvd30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge0xheWVyfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGlvbkxheWVySG92ZXJEYXRhLFxuICBMYXllckhvdmVyUHJvcCxcbiAgZ2V0VG9vbHRpcERpc3BsYXlEZWx0YVZhbHVlLFxuICBnZXRUb29sdGlwRGlzcGxheVZhbHVlXG59IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuaW1wb3J0IHt1c2VJbnRsfSBmcm9tICdyZWFjdC1pbnRsJztcbmltcG9ydCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2NhcGl0YWxpemVGaXJzdExldHRlcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBTdHlsZWRMYXllck5hbWUgPSBzdHlsZWQoQ2VudGVyRmxleGJveClgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsZXR0ZXItc3BhY2luZzogMC40M3B4O1xuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcblxuICBzdmcge1xuICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRUYWJsZSA9IHN0eWxlZC50YWJsZWBcbiAgJiAucm93X19kZWx0YS12YWx1ZSB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWFyZ2luLWxlZnQ6IDZweDtcblxuICAgICYucG9zaXRpdmUge1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubm90aWZpY2F0aW9uQ29sb3JzLnN1Y2Nlc3N9O1xuICAgIH1cblxuICAgICYubmVnYXRpdmUge1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubmVnYXRpdmVCdG5BY3RCZ2R9O1xuICAgIH1cbiAgfVxuICAmIC5yb3dfX25hbWUge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuICAmIC5yb3dfX3ZhbHVlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbiAgICBtYXgtd2lkdGg6IDI1MHB4O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWREaXZpZGVyID0gc3R5bGVkLmRpdmBcbiAgLy8gb2Zmc2V0IGRpdmlkZXIgdG8gcmVhY2ggcG9wb3ZlciBlZGdlXG4gIG1hcmdpbi1sZWZ0OiAtMTRweDtcbiAgbWFyZ2luLXJpZ2h0OiAtMTRweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCb3JkZXJDb2xvcn07XG5gO1xuXG5pbnRlcmZhY2UgUm93UHJvcHMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGRlbHRhVmFsdWU/OiBzdHJpbmcgfCBudWxsO1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFRPT0xUSVBfVkFMVUVfTUFYX0xFTkdUSCA9IDI1NjtcblxuY29uc3QgUm93OiBSZWFjdC5GQzxSb3dQcm9wcz4gPSAoe25hbWUsIHZhbHVlLCBkZWx0YVZhbHVlLCB1cmx9KSA9PiB7XG4gIC8vIFNldCAndXJsJyB0byAndmFsdWUnIGlmIGl0IGxvb2tzIGxpa2UgYSB1cmxcbiAgaWYgKCF1cmwgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5tYXRjaCgvXmh0dHAvKSkge1xuICAgIHVybCA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZGlzcGxheVZhbHVlID1cbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IFRPT0xUSVBfVkFMVUVfTUFYX0xFTkdUSFxuICAgICAgPyB0cnVuY2F0ZSh2YWx1ZSwge2xlbmd0aDogVE9PTFRJUF9WQUxVRV9NQVhfTEVOR1RIfSlcbiAgICAgIDogdmFsdWU7XG5cbiAgY29uc3QgYXNJbWcgPSAvPGltZz4vLnRlc3QobmFtZSk7XG4gIHJldHVybiAoXG4gICAgPHRyIGNsYXNzTmFtZT1cImxheWVyLWhvdmVyLWluZm9fX3Jvd1wiIGtleT17bmFtZX0+XG4gICAgICA8dGQgY2xhc3NOYW1lPVwicm93X19uYW1lXCI+e2FzSW1nID8gbmFtZS5yZXBsYWNlKCc8aW1nPicsICcnKSA6IG5hbWV9PC90ZD5cbiAgICAgIDx0ZCBjbGFzc05hbWU9XCJyb3dfX3ZhbHVlXCI+XG4gICAgICAgIHthc0ltZyA/IChcbiAgICAgICAgICA8aW1nIHNyYz17dmFsdWV9IC8+XG4gICAgICAgICkgOiB1cmwgPyAoXG4gICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIGhyZWY9e3VybH0+XG4gICAgICAgICAgICB7ZGlzcGxheVZhbHVlfVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPHNwYW4+e2Rpc3BsYXlWYWx1ZX08L3NwYW4+XG4gICAgICAgICAgICB7bm90TnVsbG9yVW5kZWZpbmVkKGRlbHRhVmFsdWUpID8gKFxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHJvd19fZGVsdGEtdmFsdWUgJHtcbiAgICAgICAgICAgICAgICAgIGRlbHRhVmFsdWU/LnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAnKycgPyAncG9zaXRpdmUnIDogJ25lZ2F0aXZlJ1xuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2RlbHRhVmFsdWV9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgRW50cnlJbmZvUHJvcHMgPSBNZXJnZTxMYXllckhvdmVyUHJvcCwge2ZpZWxkc1RvU2hvdzogVG9vbHRpcEZpZWxkW119PjtcblxuY29uc3QgRW50cnlJbmZvOiBSZWFjdC5GQzxFbnRyeUluZm9Qcm9wcz4gPSAoe2ZpZWxkc1RvU2hvdywgLi4ucHJvcHN9KSA9PiAoXG4gIDx0Ym9keT5cbiAgICB7ZmllbGRzVG9TaG93Lm1hcChpdGVtID0+IChcbiAgICAgIDxFbnRyeUluZm9Sb3cga2V5PXtpdGVtLm5hbWV9IGl0ZW09e2l0ZW19IHsuLi5wcm9wc30gLz5cbiAgICApKX1cbiAgPC90Ym9keT5cbik7XG5cbmV4cG9ydCB0eXBlIEVudHJ5SW5mb1Jvd1Byb3BzID0ge1xuICBkYXRhOiBMYXllckhvdmVyUHJvcFsnZGF0YSddO1xuICBmaWVsZHM6IEZpZWxkW107XG4gIGxheWVyOiBMYXllcjtcbiAgcHJpbWFyeURhdGE/OiBMYXllckhvdmVyUHJvcFsncHJpbWFyeURhdGEnXTtcbiAgY29tcGFyZVR5cGU/OiBDb21wYXJlVHlwZTtcbiAgY3VycmVudFRpbWU/OiBWaXNTdGF0ZVsnYW5pbWF0aW9uQ29uZmlnJ11bJ2N1cnJlbnRUaW1lJ107XG4gIGl0ZW06IFRvb2x0aXBGaWVsZDtcbn07XG5cbmNvbnN0IEVudHJ5SW5mb1JvdzogUmVhY3QuRkM8RW50cnlJbmZvUm93UHJvcHM+ID0gKHtcbiAgbGF5ZXIsXG4gIGl0ZW0sXG4gIGZpZWxkcyxcbiAgZGF0YSxcbiAgcHJpbWFyeURhdGEsXG4gIGNvbXBhcmVUeXBlLFxuICBjdXJyZW50VGltZVxufSkgPT4ge1xuICBjb25zdCBmaWVsZElkeCA9IGZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGl0ZW0ubmFtZSk7XG4gIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBmaWVsZCA9IGZpZWxkc1tmaWVsZElkeF07XG4gIGNvbnN0IGZpZWxkVmFsdWVBY2Nlc3NvciA9IGxheWVyLmFjY2Vzc1ZTRmllbGRWYWx1ZShmaWVsZCwgY3VycmVudFRpbWUpO1xuICBjb25zdCB2YWx1ZSA9IGZpZWxkVmFsdWVBY2Nlc3NvcihmaWVsZCwgZGF0YSBpbnN0YW5jZW9mIERhdGFSb3cgPyB7aW5kZXg6IGRhdGEuX3Jvd0luZGV4fSA6IGRhdGEpO1xuXG4gIC8vIEhhbmRsZSBXTVMgbGF5ZXIgZGF0YSBpbiBjb21wYXJpc29uIG1vZGUgLSBXTVMgbGF5ZXJzIGRvbid0IGhhdmUgY29tcGFyYWJsZSBmaWVsZCBkYXRhXG4gIGxldCBwcmltYXJ5VmFsdWUgPSBudWxsO1xuICBsZXQgZGlzcGxheURlbHRhVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChwcmltYXJ5RGF0YSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBPbmx5IGNhbGN1bGF0ZSBwcmltYXJ5IHZhbHVlIGlmIHByaW1hcnlEYXRhIGhhcyBhIGNvbXBhdGlibGUgc3RydWN0dXJlXG4gICAgICBpZiAoXG4gICAgICAgIHByaW1hcnlEYXRhIGluc3RhbmNlb2YgRGF0YVJvdyB8fFxuICAgICAgICAocHJpbWFyeURhdGEgJiYgdHlwZW9mIHByaW1hcnlEYXRhID09PSAnb2JqZWN0JyAmJiAnaW5kZXgnIGluIHByaW1hcnlEYXRhKVxuICAgICAgKSB7XG4gICAgICAgIHByaW1hcnlWYWx1ZSA9IGZpZWxkVmFsdWVBY2Nlc3NvcihcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBwcmltYXJ5RGF0YSBpbnN0YW5jZW9mIERhdGFSb3cgPyB7aW5kZXg6IHByaW1hcnlEYXRhLl9yb3dJbmRleH0gOiBwcmltYXJ5RGF0YVxuICAgICAgICApO1xuXG4gICAgICAgIGRpc3BsYXlEZWx0YVZhbHVlID0gZ2V0VG9vbHRpcERpc3BsYXlEZWx0YVZhbHVlKHtcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmltYXJ5VmFsdWUsXG4gICAgICAgICAgY29tcGFyZVR5cGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXJyb3IgYWNjZXNzaW5nIHByaW1hcnlEYXRhIChlLmcuLCBXTVMgbGF5ZXIgZGF0YSksIHNraXAgY29tcGFyaXNvblxuICAgICAgcHJpbWFyeVZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkaXNwbGF5VmFsdWUgPSBnZXRUb29sdGlwRGlzcGxheVZhbHVlKHtpdGVtLCBmaWVsZCwgdmFsdWV9KTtcblxuICByZXR1cm4gKFxuICAgIDxSb3dcbiAgICAgIG5hbWU9e2ZpZWxkLmRpc3BsYXlOYW1lIHx8IGZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17ZGlzcGxheVZhbHVlfVxuICAgICAgZGVsdGFWYWx1ZT17ZGlzcGxheURlbHRhVmFsdWV9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8vIFRPRE86IHN1cHBvcnRpbmcgY29tcGFyYXRpdmUgdmFsdWUgZm9yIGFnZ3JlZ2F0ZWQgY2VsbHMgYXMgd2VsbFxuY29uc3QgQ2VsbEluZm8gPSAoe1xuICBmaWVsZHNUb1Nob3csXG4gIGRhdGEsXG4gIGxheWVyXG59OiB7XG4gIGRhdGE6IEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGE7XG4gIGZpZWxkc1RvU2hvdzogVG9vbHRpcEZpZWxkW107XG4gIGxheWVyOiBMYXllcjtcbn0pID0+IHtcbiAgY29uc3Qge2NvbG9yRmllbGQsIHNpemVGaWVsZH0gPSBsYXllci5jb25maWcgYXMgYW55O1xuXG4gIGNvbnN0IGNvbG9yVmFsdWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoY29sb3JGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5jb2xvcikge1xuICAgICAgY29uc3QgaXRlbSA9IGZpZWxkc1RvU2hvdy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09IGNvbG9yRmllbGQubmFtZSk7XG4gICAgICByZXR1cm4gZ2V0VG9vbHRpcERpc3BsYXlWYWx1ZSh7aXRlbSwgZmllbGQ6IGNvbG9yRmllbGQsIHZhbHVlOiBkYXRhLmNvbG9yVmFsdWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIFtmaWVsZHNUb1Nob3csIGNvbG9yRmllbGQsIGxheWVyLCBkYXRhLmNvbG9yVmFsdWVdKTtcblxuICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChzaXplRmllbGQgJiYgbGF5ZXIudmlzdWFsQ2hhbm5lbHMuc2l6ZSkge1xuICAgICAgY29uc3QgaXRlbSA9IGZpZWxkc1RvU2hvdy5maW5kKGZpZWxkID0+IGZpZWxkLm5hbWUgPT09IHNpemVGaWVsZC5uYW1lKTtcbiAgICAgIHJldHVybiBnZXRUb29sdGlwRGlzcGxheVZhbHVlKHtpdGVtLCBmaWVsZDogc2l6ZUZpZWxkLCB2YWx1ZTogZGF0YS5lbGV2YXRpb25WYWx1ZX0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW2ZpZWxkc1RvU2hvdywgc2l6ZUZpZWxkLCBsYXllciwgZGF0YS5lbGV2YXRpb25WYWx1ZV0pO1xuXG4gIGNvbnN0IGFnZ3JlZ2F0ZWREYXRhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRhdGEuYWdncmVnYXRlZERhdGEgJiYgZmllbGRzVG9TaG93KSB7XG4gICAgICByZXR1cm4gZmllbGRzVG9TaG93LnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhRm9yRmllbGQgPSBkYXRhLmFnZ3JlZ2F0ZWREYXRhPy5bZmllbGQubmFtZV07XG4gICAgICAgIGlmIChkYXRhRm9yRmllbGQ/Lm1lYXN1cmUgJiYgZmllbGQubmFtZSAhPT0gY29sb3JGaWVsZD8ubmFtZSkge1xuICAgICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IGAke2NhcGl0YWxpemVGaXJzdExldHRlcihkYXRhRm9yRmllbGQubWVhc3VyZSl9IG9mICR7ZmllbGQubmFtZX1gLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGFGb3JGaWVsZC52YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSBhcyB7bmFtZTogc3RyaW5nOyB2YWx1ZT86IHN0cmluZ31bXSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfSwgW2RhdGEuYWdncmVnYXRlZERhdGEsIGZpZWxkc1RvU2hvdywgY29sb3JGaWVsZD8ubmFtZV0pO1xuXG4gIGNvbnN0IGNvbG9yTWVhc3VyZSA9IGxheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignY29sb3InKS5tZWFzdXJlO1xuICBjb25zdCBzaXplTWVhc3VyZSA9IGxheWVyLmdldFZpc3VhbENoYW5uZWxEZXNjcmlwdGlvbignc2l6ZScpLm1lYXN1cmU7XG4gIHJldHVybiAoXG4gICAgPHRib2R5PlxuICAgICAgPFJvdyBuYW1lPXsndG90YWwgcG9pbnRzJ30ga2V5PVwiY291bnRcIiB2YWx1ZT17U3RyaW5nKGRhdGEucG9pbnRzICYmIGRhdGEucG9pbnRzLmxlbmd0aCl9IC8+XG4gICAgICB7Y29sb3JGaWVsZCAmJiBsYXllci52aXN1YWxDaGFubmVscy5jb2xvciAmJiBjb2xvck1lYXN1cmUgPyAoXG4gICAgICAgIDxSb3cgbmFtZT17Y29sb3JNZWFzdXJlfSBrZXk9XCJjb2xvclwiIHZhbHVlPXtjb2xvclZhbHVlIHx8ICdOL0EnfSAvPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7c2l6ZUZpZWxkICYmIGxheWVyLnZpc3VhbENoYW5uZWxzLnNpemUgJiYgc2l6ZU1lYXN1cmUgPyAoXG4gICAgICAgIDxSb3cgbmFtZT17c2l6ZU1lYXN1cmV9IGtleT1cInNpemVcIiB2YWx1ZT17ZWxldmF0aW9uVmFsdWUgfHwgJ04vQSd9IC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHthZ2dyZWdhdGVkRGF0YS5tYXAoKGRhdGFGb3JGaWVsZCwgaWR4KSA9PiAoXG4gICAgICAgIDxSb3cgbmFtZT17ZGF0YUZvckZpZWxkLm5hbWV9IGtleT17YGRhdGFfJHtpZHh9YH0gdmFsdWU9e2RhdGFGb3JGaWVsZC52YWx1ZSB8fCAnTi9BJ30gLz5cbiAgICAgICkpfVxuICAgIDwvdGJvZHk+XG4gICk7XG59O1xuXG5jb25zdCBMYXllckhvdmVySW5mb0ZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IExheWVySG92ZXJJbmZvID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtkYXRhLCBsYXllcn0gPSBwcm9wcztcbiAgICBjb25zdCBpbnRsID0gdXNlSW50bCgpO1xuICAgIGlmICghZGF0YSB8fCAhbGF5ZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0ZpZWxkc1RvU2hvdyA9XG4gICAgICAoZGF0YS5maWVsZFZhbHVlcyAmJiBPYmplY3Qua2V5cyhkYXRhLmZpZWxkVmFsdWVzKS5sZW5ndGggPiAwKSB8fFxuICAgICAgKGRhdGEud21zRmVhdHVyZURhdGEgJiYgZGF0YS53bXNGZWF0dXJlRGF0YS5sZW5ndGggPiAwKSB8fFxuICAgICAgKHByb3BzLmZpZWxkc1RvU2hvdyAmJiBwcm9wcy5maWVsZHNUb1Nob3cubGVuZ3RoID4gMCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXAtcG9wb3Zlcl9fbGF5ZXItaW5mb1wiPlxuICAgICAgICA8U3R5bGVkTGF5ZXJOYW1lIGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyX19sYXllci1uYW1lXCI+XG4gICAgICAgICAgPExheWVycyBoZWlnaHQ9XCIxMnB4XCIgLz5cbiAgICAgICAgICB7cHJvcHMubGF5ZXIuY29uZmlnLmxhYmVsfVxuICAgICAgICA8L1N0eWxlZExheWVyTmFtZT5cbiAgICAgICAge2hhc0ZpZWxkc1RvU2hvdyAmJiA8U3R5bGVkRGl2aWRlciAvPn1cbiAgICAgICAgPFN0eWxlZFRhYmxlPlxuICAgICAgICAgIHtkYXRhLndtc0ZlYXR1cmVEYXRhID8gKFxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICB7ZGF0YS53bXNGZWF0dXJlRGF0YS5tYXAoKHtuYW1lLCB2YWx1ZX0sIGkpID0+IChcbiAgICAgICAgICAgICAgICA8Um93IGtleT17aX0gbmFtZT17bmFtZX0gdmFsdWU9e3ZhbHVlfSAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgKSA6IGRhdGEuZmllbGRWYWx1ZXMgPyAoXG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgIHtkYXRhLmZpZWxkVmFsdWVzLm1hcCgoe2xhYmVsTWVzc2FnZSwgdmFsdWV9LCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgPFJvdyBrZXk9e2l9IG5hbWU9e2ludGwuZm9ybWF0TWVzc2FnZSh7aWQ6IGxhYmVsTWVzc2FnZX0pfSB2YWx1ZT17dmFsdWV9IC8+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICApIDogcHJvcHMubGF5ZXIuaXNBZ2dyZWdhdGVkID8gKFxuICAgICAgICAgICAgPENlbGxJbmZvIHsuLi5wcm9wc30gLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPEVudHJ5SW5mbyB7Li4ucHJvcHN9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9TdHlsZWRUYWJsZT5cbiAgICAgICAge2hhc0ZpZWxkc1RvU2hvdyAmJiA8U3R5bGVkRGl2aWRlciAvPn1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH07XG5cbiAgTGF5ZXJIb3ZlckluZm8ucHJvcFR5cGVzID0ge1xuICAgIGZpZWxkczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgZmllbGRzVG9TaG93OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICBsYXllcjogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBkYXRhOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSwgUHJvcFR5cGVzLm9iamVjdF0pXG4gIH07XG4gIHJldHVybiBMYXllckhvdmVySW5mbztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IExheWVySG92ZXJJbmZvRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFB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