kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
132 lines (131 loc) • 28.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = FloatingTimeDisplayFactory;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _classnames = _interopRequireDefault(require("classnames"));
var _icons = require("../icons");
var _constants = require("@kepler.gl/constants");
var _styledComponents2 = require("../../common/styled-components");
var _utils = require("@kepler.gl/utils");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8; // 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 StyledTimeDisplayWrapper = _styledComponents["default"].div.attrs({
className: 'floating-time-display'
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n bottom: ", ";\n display: flex;\n position: absolute;\n width: 100%;\n margin-left: -", "px;\n justify-content: center;\n pointer-events: none; /* prevent padding from blocking input */\n & > * {\n /* all children should allow input */\n pointer-events: all;\n }\n"])), function (props) {
return "calc(100% + ".concat(props.theme.bottomPanelGap, "px)");
}, function (props) {
return props.theme.bottomInnerPdSide;
});
var StyledTimeDisplay = _styledComponents["default"].div.attrs(function (props) {
return {
className: (0, _classnames["default"])('floating-time-display__inner', props.className)
};
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n border-radius: ", "px;\n color: ", ";\n display: flex;\n height: ", "px;\n justify-content: center;\n min-width: ", "px;\n opacity: ", ";\n padding: ", ";\n"])), function (props) {
return props.theme.panelBackground;
}, function (props) {
return props.theme.timeDisplayBorderRadius;
}, function (props) {
return props.theme.titleTextColor;
}, function (props) {
return props.theme.timeDisplayHeight;
}, function (props) {
return props.theme.timeDisplayMinWidth;
}, function (props) {
return props.theme.timeDisplayOpacity;
}, function (props) {
return props.theme.timeDisplayPadding;
});
var StyledTimeDisplayGroups = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n display: flex;\n flex-direction: row;\n"])));
var StyledTimeDisplayRows = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n justify-content: center;\n"])));
var StyledTimeDisplayTop = _styledComponents["default"].div.attrs({
className: 'animation-control__time-display__top'
})(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n display: flex;\n font-size: 12px;\n font-weight: 500;\n justify-content: center;\n"])), function (props) {
return props.theme.textColor;
});
var StyledTimeDisplayBottom = _styledComponents["default"].div.attrs({
className: 'animation-control__time-display__bottom'
})(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n display: flex;\n font-size: 14px;\n font-weight: 500;\n justify-content: center;\n"])), function (props) {
return props.theme.titleTextColor;
});
var StyledTimeValueGroup = _styledComponents["default"].div.attrs({
className: 'animation-control__time-value-group'
})(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n"])));
var StyledHorizontalBar = _styledComponents["default"].div.attrs({
className: 'animation-control__horizontal-bar'
})(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0 12px;\n"])));
var TimeDivider = function TimeDivider() {
return /*#__PURE__*/_react["default"].createElement(StyledHorizontalBar, null, /*#__PURE__*/_react["default"].createElement(_icons.Minus, {
height: "12px"
}));
};
var TimeDisplayRow = function TimeDisplayRow(_ref) {
var _ref$timeValues = _ref.timeValues,
timeValues = _ref$timeValues === void 0 ? [] : _ref$timeValues;
return /*#__PURE__*/_react["default"].createElement(_styledComponents2.CenterFlexbox, null, /*#__PURE__*/_react["default"].createElement("div", {
className: "time-value"
}, timeValues[0]), timeValues[1] ? /*#__PURE__*/_react["default"].createElement(TimeDivider, null) : null, timeValues[1] ? /*#__PURE__*/_react["default"].createElement("div", {
className: "time-value"
}, timeValues[1]) : null);
};
function FloatingTimeDisplayFactory() {
var FloatingTimeDisplay = function FloatingTimeDisplay(_ref2) {
var currentTime = _ref2.currentTime,
defaultTimeFormat = _ref2.defaultTimeFormat,
timeFormat = _ref2.timeFormat,
timezone = _ref2.timezone;
var _useMemo = (0, _react.useMemo)(function () {
var groupTime = Array.isArray(currentTime) ? currentTime : [currentTime];
var hasUserFormat = typeof timeFormat === 'string';
var currentFormat = (hasUserFormat ? timeFormat : defaultTimeFormat) || _constants.DEFAULT_TIME_FORMAT;
var dateFunc = (0, _utils.datetimeFormatter)(timezone);
if (hasUserFormat) {
// dont split time if user defined it
return {
displayDate: groupTime.map(dateFunc(currentFormat)),
displayTime: []
};
}
return groupTime.reduce(function (accu, curr) {
var _currentFormat$split = currentFormat.split(' '),
_currentFormat$split2 = (0, _slicedToArray2["default"])(_currentFormat$split, 2),
dateFormat = _currentFormat$split2[0],
datetimeFormat = _currentFormat$split2[1];
var dateString = dateFunc(dateFormat)(curr);
var timeString = datetimeFormat ? dateFunc(datetimeFormat)(curr) : null;
if (!accu.displayDate.includes(dateString)) {
accu.displayDate.push(dateString);
}
if (timeString) {
accu.displayTime.push(timeString);
}
return accu;
}, {
displayDate: [],
displayTime: []
});
}, [currentTime, timeFormat, defaultTimeFormat, timezone]),
displayDate = _useMemo.displayDate,
displayTime = _useMemo.displayTime;
var twoGroups = displayDate.length === 2 && displayTime.length === 2;
var bottomRow = displayTime.length ? displayTime : displayDate.length ? displayDate : null;
var topRow = displayDate.length && displayTime.length ? displayDate : null;
return /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayWrapper, null, /*#__PURE__*/_react["default"].createElement(StyledTimeDisplay, {
className: "animation-control__time-display"
}, twoGroups ? /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayGroups, null, /*#__PURE__*/_react["default"].createElement(StyledTimeValueGroup, null, /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayTop, null, displayDate[0]), /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayBottom, null, displayTime[0])), /*#__PURE__*/_react["default"].createElement(TimeDivider, null), /*#__PURE__*/_react["default"].createElement(StyledTimeValueGroup, null, /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayTop, null, displayDate[1]), /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayBottom, null, displayTime[1]))) : /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayRows, null, topRow ? /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayTop, null, /*#__PURE__*/_react["default"].createElement(TimeDisplayRow, {
timeValues: topRow
})) : null, bottomRow ? /*#__PURE__*/_react["default"].createElement(StyledTimeDisplayBottom, null, /*#__PURE__*/_react["default"].createElement(TimeDisplayRow, {
timeValues: bottomRow
})) : null)));
};
return FloatingTimeDisplay;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9pY29ucyIsIl9jb25zdGFudHMiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfdXRpbHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl90ZW1wbGF0ZU9iamVjdDciLCJfdGVtcGxhdGVPYmplY3Q4IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU3R5bGVkVGltZURpc3BsYXlXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiYXR0cnMiLCJjbGFzc05hbWUiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwiY29uY2F0IiwidGhlbWUiLCJib3R0b21QYW5lbEdhcCIsImJvdHRvbUlubmVyUGRTaWRlIiwiU3R5bGVkVGltZURpc3BsYXkiLCJjbGFzc25hbWVzIiwicGFuZWxCYWNrZ3JvdW5kIiwidGltZURpc3BsYXlCb3JkZXJSYWRpdXMiLCJ0aXRsZVRleHRDb2xvciIsInRpbWVEaXNwbGF5SGVpZ2h0IiwidGltZURpc3BsYXlNaW5XaWR0aCIsInRpbWVEaXNwbGF5T3BhY2l0eSIsInRpbWVEaXNwbGF5UGFkZGluZyIsIlN0eWxlZFRpbWVEaXNwbGF5R3JvdXBzIiwiU3R5bGVkVGltZURpc3BsYXlSb3dzIiwiU3R5bGVkVGltZURpc3BsYXlUb3AiLCJ0ZXh0Q29sb3IiLCJTdHlsZWRUaW1lRGlzcGxheUJvdHRvbSIsIlN0eWxlZFRpbWVWYWx1ZUdyb3VwIiwiU3R5bGVkSG9yaXpvbnRhbEJhciIsIlRpbWVEaXZpZGVyIiwiY3JlYXRlRWxlbWVudCIsIk1pbnVzIiwiaGVpZ2h0IiwiVGltZURpc3BsYXlSb3ciLCJfcmVmIiwiX3JlZiR0aW1lVmFsdWVzIiwidGltZVZhbHVlcyIsIkNlbnRlckZsZXhib3giLCJGbG9hdGluZ1RpbWVEaXNwbGF5RmFjdG9yeSIsIkZsb2F0aW5nVGltZURpc3BsYXkiLCJfcmVmMiIsImN1cnJlbnRUaW1lIiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJ0aW1lRm9ybWF0IiwidGltZXpvbmUiLCJfdXNlTWVtbyIsInVzZU1lbW8iLCJncm91cFRpbWUiLCJBcnJheSIsImlzQXJyYXkiLCJoYXNVc2VyRm9ybWF0IiwiY3VycmVudEZvcm1hdCIsIkRFRkFVTFRfVElNRV9GT1JNQVQiLCJkYXRlRnVuYyIsImRhdGV0aW1lRm9ybWF0dGVyIiwiZGlzcGxheURhdGUiLCJtYXAiLCJkaXNwbGF5VGltZSIsInJlZHVjZSIsImFjY3UiLCJjdXJyIiwiX2N1cnJlbnRGb3JtYXQkc3BsaXQiLCJzcGxpdCIsIl9jdXJyZW50Rm9ybWF0JHNwbGl0MiIsIl9zbGljZWRUb0FycmF5MiIsImRhdGVGb3JtYXQiLCJkYXRldGltZUZvcm1hdCIsImRhdGVTdHJpbmciLCJ0aW1lU3RyaW5nIiwiaW5jbHVkZXMiLCJwdXNoIiwidHdvR3JvdXBzIiwibGVuZ3RoIiwiYm90dG9tUm93IiwidG9wUm93Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi9hbmltYXRpb24tY29udHJvbC9mbG9hdGluZy10aW1lLWRpc3BsYXkudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQge01pbnVzfSBmcm9tICcuLi9pY29ucyc7XG5pbXBvcnQge0RFRkFVTFRfVElNRV9GT1JNQVR9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q2VudGVyRmxleGJveH0gZnJvbSAnLi4vLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7ZGF0ZXRpbWVGb3JtYXR0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5jb25zdCBTdHlsZWRUaW1lRGlzcGxheVdyYXBwZXIgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnZmxvYXRpbmctdGltZS1kaXNwbGF5J1xufSlgXG4gIGJvdHRvbTogJHtwcm9wcyA9PiBgY2FsYygxMDAlICsgJHtwcm9wcy50aGVtZS5ib3R0b21QYW5lbEdhcH1weClgfTtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luLWxlZnQ6IC0ke3Byb3BzID0+IHByb3BzLnRoZW1lLmJvdHRvbUlubmVyUGRTaWRlfXB4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IC8qIHByZXZlbnQgcGFkZGluZyBmcm9tIGJsb2NraW5nIGlucHV0ICovXG4gICYgPiAqIHtcbiAgICAvKiBhbGwgY2hpbGRyZW4gc2hvdWxkIGFsbG93IGlucHV0ICovXG4gICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkVGltZURpc3BsYXkgPSBzdHlsZWQuZGl2LmF0dHJzKHByb3BzID0+ICh7XG4gIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnZmxvYXRpbmctdGltZS1kaXNwbGF5X19pbm5lcicsIHByb3BzLmNsYXNzTmFtZSlcbn0pKWBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuICBib3JkZXItcmFkaXVzOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRpbWVEaXNwbGF5Qm9yZGVyUmFkaXVzfXB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aXRsZVRleHRDb2xvcn07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aW1lRGlzcGxheUhlaWdodH1weDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG1pbi13aWR0aDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aW1lRGlzcGxheU1pbldpZHRofXB4O1xuICBvcGFjaXR5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRpbWVEaXNwbGF5T3BhY2l0eX07XG4gIHBhZGRpbmc6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGltZURpc3BsYXlQYWRkaW5nfTtcbmA7XG5cbmNvbnN0IFN0eWxlZFRpbWVEaXNwbGF5R3JvdXBzID0gc3R5bGVkLmRpdmBcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbmA7XG5cbmNvbnN0IFN0eWxlZFRpbWVEaXNwbGF5Um93cyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkVGltZURpc3BsYXlUb3AgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnYW5pbWF0aW9uLWNvbnRyb2xfX3RpbWUtZGlzcGxheV9fdG9wJ1xufSlgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5gO1xuXG5jb25zdCBTdHlsZWRUaW1lRGlzcGxheUJvdHRvbSA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdhbmltYXRpb24tY29udHJvbF9fdGltZS1kaXNwbGF5X19ib3R0b20nXG59KWBcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGl0bGVUZXh0Q29sb3J9O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkVGltZVZhbHVlR3JvdXAgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnYW5pbWF0aW9uLWNvbnRyb2xfX3RpbWUtdmFsdWUtZ3JvdXAnXG59KWBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbmA7XG5cbmNvbnN0IFN0eWxlZEhvcml6b250YWxCYXIgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnYW5pbWF0aW9uLWNvbnRyb2xfX2hvcml6b250YWwtYmFyJ1xufSlgXG4gIG1hcmdpbjogMCAxMnB4O1xuYDtcblxuY29uc3QgVGltZURpdmlkZXIgPSAoKSA9PiAoXG4gIDxTdHlsZWRIb3Jpem9udGFsQmFyPlxuICAgIDxNaW51cyBoZWlnaHQ9XCIxMnB4XCIgLz5cbiAgPC9TdHlsZWRIb3Jpem9udGFsQmFyPlxuKTtcblxuaW50ZXJmYWNlIFRpbWVEaXNwbGF5Um93UHJvcHMge1xuICB0aW1lVmFsdWVzPzogc3RyaW5nW107XG59XG5cbmNvbnN0IFRpbWVEaXNwbGF5Um93ID0gKHt0aW1lVmFsdWVzID0gW119OiBUaW1lRGlzcGxheVJvd1Byb3BzKSA9PiAoXG4gIDxDZW50ZXJGbGV4Ym94PlxuICAgIDxkaXYgY2xhc3NOYW1lPVwidGltZS12YWx1ZVwiPnt0aW1lVmFsdWVzWzBdfTwvZGl2PlxuICAgIHt0aW1lVmFsdWVzWzFdID8gPFRpbWVEaXZpZGVyIC8+IDogbnVsbH1cbiAgICB7dGltZVZhbHVlc1sxXSA/IDxkaXYgY2xhc3NOYW1lPVwidGltZS12YWx1ZVwiPnt0aW1lVmFsdWVzWzFdfTwvZGl2PiA6IG51bGx9XG4gIDwvQ2VudGVyRmxleGJveD5cbik7XG5cbmludGVyZmFjZSBGbG9hdGluZ1RpbWVEaXNwbGF5UHJvcHMge1xuICBjdXJyZW50VGltZTogbnVtYmVyIHwgbnVtYmVyW107XG4gIGRlZmF1bHRUaW1lRm9ybWF0Pzogc3RyaW5nIHwgbnVsbDtcbiAgdGltZUZvcm1hdD86IHN0cmluZyB8IG51bGw7XG4gIHRpbWV6b25lPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRmxvYXRpbmdUaW1lRGlzcGxheUZhY3RvcnkoKSB7XG4gIGNvbnN0IEZsb2F0aW5nVGltZURpc3BsYXkgPSAoe1xuICAgIGN1cnJlbnRUaW1lLFxuICAgIGRlZmF1bHRUaW1lRm9ybWF0LFxuICAgIHRpbWVGb3JtYXQsXG4gICAgdGltZXpvbmVcbiAgfTogRmxvYXRpbmdUaW1lRGlzcGxheVByb3BzKSA9PiB7XG4gICAgY29uc3Qge2Rpc3BsYXlEYXRlLCBkaXNwbGF5VGltZX0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwVGltZSA9IEFycmF5LmlzQXJyYXkoY3VycmVudFRpbWUpID8gY3VycmVudFRpbWUgOiBbY3VycmVudFRpbWVdO1xuICAgICAgY29uc3QgaGFzVXNlckZvcm1hdCA9IHR5cGVvZiB0aW1lRm9ybWF0ID09PSAnc3RyaW5nJztcbiAgICAgIGNvbnN0IGN1cnJlbnRGb3JtYXQgPSAoaGFzVXNlckZvcm1hdCA/IHRpbWVGb3JtYXQgOiBkZWZhdWx0VGltZUZvcm1hdCkgfHwgREVGQVVMVF9USU1FX0ZPUk1BVDtcbiAgICAgIGNvbnN0IGRhdGVGdW5jID0gZGF0ZXRpbWVGb3JtYXR0ZXIodGltZXpvbmUpO1xuXG4gICAgICBpZiAoaGFzVXNlckZvcm1hdCkge1xuICAgICAgICAvLyBkb250IHNwbGl0IHRpbWUgaWYgdXNlciBkZWZpbmVkIGl0XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGlzcGxheURhdGU6IGdyb3VwVGltZS5tYXAoZGF0ZUZ1bmMoY3VycmVudEZvcm1hdCkpLFxuICAgICAgICAgIGRpc3BsYXlUaW1lOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdyb3VwVGltZS5yZWR1Y2U8e2Rpc3BsYXlEYXRlOiBzdHJpbmdbXTsgZGlzcGxheVRpbWU6IHN0cmluZ1tdfT4oXG4gICAgICAgIChhY2N1LCBjdXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgW2RhdGVGb3JtYXQsIGRhdGV0aW1lRm9ybWF0XSA9IGN1cnJlbnRGb3JtYXQuc3BsaXQoJyAnKTtcbiAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZGF0ZUZ1bmMoZGF0ZUZvcm1hdCkoY3Vycik7XG4gICAgICAgICAgY29uc3QgdGltZVN0cmluZyA9IGRhdGV0aW1lRm9ybWF0ID8gZGF0ZUZ1bmMoZGF0ZXRpbWVGb3JtYXQpKGN1cnIpIDogbnVsbDtcblxuICAgICAgICAgIGlmICghYWNjdS5kaXNwbGF5RGF0ZS5pbmNsdWRlcyhkYXRlU3RyaW5nKSkge1xuICAgICAgICAgICAgYWNjdS5kaXNwbGF5RGF0ZS5wdXNoKGRhdGVTdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGltZVN0cmluZykge1xuICAgICAgICAgICAgYWNjdS5kaXNwbGF5VGltZS5wdXNoKHRpbWVTdHJpbmcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhY2N1O1xuICAgICAgICB9LFxuICAgICAgICB7ZGlzcGxheURhdGU6IFtdLCBkaXNwbGF5VGltZTogW119IGFzIHtkaXNwbGF5RGF0ZTogc3RyaW5nW107IGRpc3BsYXlUaW1lOiBzdHJpbmdbXX1cbiAgICAgICk7XG4gICAgfSwgW2N1cnJlbnRUaW1lLCB0aW1lRm9ybWF0LCBkZWZhdWx0VGltZUZvcm1hdCwgdGltZXpvbmVdKTtcblxuICAgIGNvbnN0IHR3b0dyb3VwcyA9IGRpc3BsYXlEYXRlLmxlbmd0aCA9PT0gMiAmJiBkaXNwbGF5VGltZS5sZW5ndGggPT09IDI7XG4gICAgY29uc3QgYm90dG9tUm93ID0gZGlzcGxheVRpbWUubGVuZ3RoID8gZGlzcGxheVRpbWUgOiBkaXNwbGF5RGF0ZS5sZW5ndGggPyBkaXNwbGF5RGF0ZSA6IG51bGw7XG4gICAgY29uc3QgdG9wUm93ID0gZGlzcGxheURhdGUubGVuZ3RoICYmIGRpc3BsYXlUaW1lLmxlbmd0aCA/IGRpc3BsYXlEYXRlIDogbnVsbDtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkVGltZURpc3BsYXlXcmFwcGVyPlxuICAgICAgICA8U3R5bGVkVGltZURpc3BsYXkgY2xhc3NOYW1lPVwiYW5pbWF0aW9uLWNvbnRyb2xfX3RpbWUtZGlzcGxheVwiPlxuICAgICAgICAgIHt0d29Hcm91cHMgPyAoXG4gICAgICAgICAgICA8U3R5bGVkVGltZURpc3BsYXlHcm91cHM+XG4gICAgICAgICAgICAgIDxTdHlsZWRUaW1lVmFsdWVHcm91cD5cbiAgICAgICAgICAgICAgICB7LyogVGltZSBTdGFydCAqL31cbiAgICAgICAgICAgICAgICA8U3R5bGVkVGltZURpc3BsYXlUb3A+e2Rpc3BsYXlEYXRlWzBdfTwvU3R5bGVkVGltZURpc3BsYXlUb3A+XG4gICAgICAgICAgICAgICAgPFN0eWxlZFRpbWVEaXNwbGF5Qm90dG9tPntkaXNwbGF5VGltZVswXX08L1N0eWxlZFRpbWVEaXNwbGF5Qm90dG9tPlxuICAgICAgICAgICAgICA8L1N0eWxlZFRpbWVWYWx1ZUdyb3VwPlxuICAgICAgICAgICAgICA8VGltZURpdmlkZXIgLz5cbiAgICAgICAgICAgICAgPFN0eWxlZFRpbWVWYWx1ZUdyb3VwPlxuICAgICAgICAgICAgICAgIHsvKiBUaW1lIEVuZCAqL31cbiAgICAgICAgICAgICAgICA8U3R5bGVkVGltZURpc3BsYXlUb3A+e2Rpc3BsYXlEYXRlWzFdfTwvU3R5bGVkVGltZURpc3BsYXlUb3A+XG4gICAgICAgICAgICAgICAgPFN0eWxlZFRpbWVEaXNwbGF5Qm90dG9tPntkaXNwbGF5VGltZVsxXX08L1N0eWxlZFRpbWVEaXNwbGF5Qm90dG9tPlxuICAgICAgICAgICAgICA8L1N0eWxlZFRpbWVWYWx1ZUdyb3VwPlxuICAgICAgICAgICAgPC9TdHlsZWRUaW1lRGlzcGxheUdyb3Vwcz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFN0eWxlZFRpbWVEaXNwbGF5Um93cz5cbiAgICAgICAgICAgICAge3RvcFJvdyA/IChcbiAgICAgICAgICAgICAgICA8U3R5bGVkVGltZURpc3BsYXlUb3A+XG4gICAgICAgICAgICAgICAgICA8VGltZURpc3BsYXlSb3cgdGltZVZhbHVlcz17dG9wUm93fSAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkVGltZURpc3BsYXlUb3A+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICB7Ym90dG9tUm93ID8gKFxuICAgICAgICAgICAgICAgIDxTdHlsZWRUaW1lRGlzcGxheUJvdHRvbT5cbiAgICAgICAgICAgICAgICAgIDxUaW1lRGlzcGxheVJvdyB0aW1lVmFsdWVzPXtib3R0b21Sb3d9IC8+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRUaW1lRGlzcGxheUJvdHRvbT5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L1N0eWxlZFRpbWVEaXNwbGF5Um93cz5cbiAgICAgICAgICApfVxuICAgICAgICA8L1N0eWxlZFRpbWVEaXNwbGF5PlxuICAgICAgPC9TdHlsZWRUaW1lRGlzcGxheVdyYXBwZXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gRmxvYXRpbmdUaW1lRGlzcGxheTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7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
;