From ad1b55ba38b5d77d2f16366e1391c11ec44af82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kurk=C3=B3=20Mih=C3=A1ly?= Date: Wed, 17 Oct 2018 15:09:53 +0300 Subject: [PATCH] dashboard, p2p: fix peer limiting bug, properly visualize traffic data diff --- dashboard/assets.go | 620 ++++++++++++------------ dashboard/assets/components/Network.jsx | 213 ++++---- dashboard/assets/types/content.jsx | 3 +- dashboard/peers.go | 231 +++++---- p2p/metrics.go | 11 +- 5 files changed, 601 insertions(+), 477 deletions(-) diff --git a/dashboard/assets.go b/dashboard/assets.go index 8bc3dc1061..c574f061a2 100644 --- a/dashboard/assets.go +++ b/dashboard/assets.go @@ -1683,44 +1683,56 @@ var _bundleJs = []byte((((`!function(n) { } ci = __webpack_require__("./node_modules/react-hot-loader/index.js").enterModule, ci && ci(module); - var inserter = function(s) { - return function(e, i) { - return e.peers && e.peers.bundles && (i.peers = e.peers), Array.isArray(e.diff) && e.diff.forEach(function(e) { - if (e.removeIP) return e.removeID && i.peers.bundles[e.removeIP] && delete i.peers.bundles[e.removeIP].knownPeers[e.removeID], - void delete i.peers.bundles[e.removeIP]; + var inserter = function(u) { + return function(e, s) { + return e.peers && e.peers.bundles && (s.peers = e.peers), Array.isArray(e.diff) && e.diff.forEach(function(e) { if (e.ip) { - i.peers.bundles[e.ip] || (i.peers.bundles[e.ip] = { - location: {}, + switch (e.remove) { + case "bundle": + return void delete s.peers.bundles[e.ip]; + + case "known": + if (!e.id) return void console.error("Remove known peer event without ID", e.ip); + var t = s.peers.bundles[e.ip]; + return t && t.knownPeers && t.knownPeers[e.id] ? void delete t.knownPeers[e.id] : void console.error("No known peer to remove", e.ip, e.id); + + case "unknown": + var n = s.peers.bundles[e.ip]; + return !n || !Array.isArray(n.unknownPeers) || n.unknownPeers.length < 1 ? void console.error("No unknown peer to remove", e.ip) : void n.unknownPeers.splice(0, 1); + } + s.peers.bundles[e.ip] || (s.peers.bundles[e.ip] = { + location: { + country: "", + city: "", + latitude: 0, + longitude: 0 + }, knownPeers: {}, unknownPeers: [] }); - var t = i.peers.bundles[e.ip]; - if (e.location && (t.location = e.location), e.id) { - t.knownPeers[e.id] || (t.knownPeers[e.id] = { + var r = s.peers.bundles[e.ip]; + if (e.location) r.location = e.location; else if (e.id) { + r.knownPeers[e.id] || (r.knownPeers[e.id] = { connected: [], disconnected: [], ingress: [], egress: [] }); - var n = t.knownPeers[e.id]; - if (e.connected && n.connected.push(e.connected), e.disconnected && n.disconnected.push(e.disconnected), + var o = r.knownPeers[e.id]; + if (e.connected && o.connected.push(e.connected), e.disconnected && o.disconnected.push(e.disconnected), Array.isArray(e.ingress) && Array.isArray(e.egress)) { - var r, o; + var a, i; if (e.ingress.length !== e.egress.length) return void console.error("Different traffic sample length", e); - 0 < n.ingress.length && n.ingress[n.ingress.length - 1].value < e.ingress[0].value && (e.ingress[0].value -= n.ingress[n.ingress.length - 1].value, - e.egress[0].value -= n.egress[n.egress.length - 1].value); - for (var a = 1; a < e.ingress.length; a++) e.ingress[a].value -= e.ingress[a - 1].value, - e.egress[a].value -= e.egress[a - 1].value; - (r = n.ingress).splice.apply(r, [ n.ingress.length, 0 ].concat(_toConsumableArray(e.ingress))), - (o = n.egress).splice.apply(o, [ n.egress.length, 0 ].concat(_toConsumableArray(e.egress))), - n.ingress.length > s && n.ingress.splice(0, n.ingress.length - s), n.egress.length > s && n.egress.splice(0, n.egress.length - s); + (a = o.ingress).splice.apply(a, [ o.ingress.length, 0 ].concat(_toConsumableArray(e.ingress))), + (i = o.egress).splice.apply(i, [ o.egress.length, 0 ].concat(_toConsumableArray(e.egress))), + o.ingress.length > u && o.ingress.splice(0, o.ingress.length - u), o.egress.length > u && o.egress.splice(0, o.egress.length - u); } - } else t.unknownPeers.push({ + } else r.unknownPeers.push({ connected: e.connected, disconnected: e.disconnected }); } else console.error("Peer event without IP", e); - }), i; + }), s; }; }, styles = {}, Network = function(_Component) { function Network() { @@ -1738,24 +1750,22 @@ var _bundleJs = []byte((((`!function(n) { key: "render", value: function() { var a = this; - return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "IP"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Location"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Unknown"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Node ID"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Traffic"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Connected"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Disconnected"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default.a, null, Object.entries(this.props.content.peers.bundles).map(function(e) { + return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "IP"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Location"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Node ID"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Traffic"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Connected"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Disconnected"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default.a, null, Object.entries(this.props.content.peers.bundles).map(function(e) { var t, n = _slicedToArray(e, 2), r = n[0], o = n[1]; - return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { - key: r + return !o.knownPeers || Object.keys(o.knownPeers).length < 1 ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { + key: "known".concat(r) }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, r), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.location ? (t = o.location, - "".concat(t.country ? t.country : "").concat(t.city ? "/".concat(t.city) : "", " ").concat(t.latitude, " ").concat(t.longitude)) : ""), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.unknownPeers && Object.values(o.unknownPeers).map(function(e) { - return e.connected && e.disconnected && "".concat(a.formatTime(e.connected), "~").concat(a.formatTime(e.disconnected)); - }).join(", ")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.knownPeers && Object.keys(o.knownPeers).map(function(e) { + "".concat(t.country ? t.country : "").concat(t.city ? "/".concat(t.city) : "", " ").concat(t.latitude, " ").concat(t.longitude)) : ""), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, Object.keys(o.knownPeers).map(function(e) { return e.substring(0, 10); - }).join(" ")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.knownPeers && Object.values(o.knownPeers).map(function(e) { + }).join(" ")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, Object.values(o.knownPeers).map(function(e) { var t = e.ingress, n = e.egress; return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_chart_AreaChart__WEBPACK_IMPORTED_MODULE_6__.a, { - width: 200, + width: 300, height: 50, syncId: "footerSyncId", - data: t.map(function(e) { + data: n.map(function(e) { return { - ingress: e.value || 0 + egress: e.value || 0 }; }), margin: { @@ -1767,21 +1777,21 @@ var _bundleJs = []byte((((`!function(n) { }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_component_Tooltip__WEBPACK_IMPORTED_MODULE_7__.a, { cursor: !1, content: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.c, { - tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.b)("Upload") + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.b)("Download") }) }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_cartesian_Area__WEBPACK_IMPORTED_MODULE_8__.a, { isAnimationActive: !1, type: "monotone", - dataKey: "ingress", + dataKey: "egress", stroke: "#8884d8", fill: "#8884d8" })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_chart_AreaChart__WEBPACK_IMPORTED_MODULE_6__.a, { - width: 200, + width: 300, height: 50, syncId: "footerSyncId", - data: n.map(function(e) { + data: t.map(function(e) { return { - egress: -e.value || 0 + ingress: -e.value || 0 }; }), margin: { @@ -1793,25 +1803,35 @@ var _bundleJs = []byte((((`!function(n) { }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_component_Tooltip__WEBPACK_IMPORTED_MODULE_7__.a, { cursor: !1, content: react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.c, { - tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.b)("Download", Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.d)(-1)) + tooltip: Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.b)("Upload", Object(CustomTooltip__WEBPACK_IMPORTED_MODULE_9__.d)(-1)) }) }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(recharts_es6_cartesian_Area__WEBPACK_IMPORTED_MODULE_8__.a, { isAnimationActive: !1, type: "monotone", - dataKey: "egress", + dataKey: "ingress", stroke: "#82ca9d", fill: "#82ca9d" }))); - })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.knownPeers && Object.values(o.knownPeers).map(function(e) { + })), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, Object.values(o.knownPeers).map(function(e) { return e.connected && e.connected.map(function(e) { return a.formatTime(e); }).join(" "); - }).join(", ")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.knownPeers && Object.values(o.knownPeers).map(function(e) { + }).join(", ")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, Object.values(o.knownPeers).map(function(e) { return e.disconnected && e.disconnected.map(function(e) { return a.formatTime(e); }).join(" "); }).join(", "))); - }))); + }))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_Table__WEBPACK_IMPORTED_MODULE_1___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableHead__WEBPACK_IMPORTED_MODULE_2___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "IP"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Location"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Connected"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, "Disconnected"))), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableBody__WEBPACK_IMPORTED_MODULE_3___default.a, null, Object.entries(this.props.content.peers.bundles).map(function(e) { + var t, n = _slicedToArray(e, 2), r = n[0], o = n[1]; + return !o.unknownPeers || o.unknownPeers.length < 1 ? null : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableRow__WEBPACK_IMPORTED_MODULE_4___default.a, { + key: "unknown".concat(r) + }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, r), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, o.location ? (t = o.location, + "".concat(t.country ? t.country : "").concat(t.city ? "/".concat(t.city) : "", " ").concat(t.latitude, " ").concat(t.longitude)) : ""), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, Object.values(o.unknownPeers).map(function(e) { + return e.connected && "".concat(a.formatTime(e.connected)); + }).join(", ")), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_material_ui_core_TableCell__WEBPACK_IMPORTED_MODULE_5___default.a, null, Object.values(o.unknownPeers).map(function(e) { + return e.disconnected && "".concat(a.formatTime(e.disconnected)); + }).join(", "))); + })))); } }, { key: "__reactstandin__regenerateByEval", @@ -1819,20 +1839,20 @@ var _bundleJs = []byte((((`!function(n) { this[key] = eval(code); } } ]), Network; - }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = Network, Mj, Nj; - __webpack_exports__.a = _default, Mj = __webpack_require__("./node_modules/react-hot-loader/index.js").default, - Nj = __webpack_require__("./node_modules/react-hot-loader/index.js").leaveModule, - Mj && (Mj.register(inserter, "inserter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), - Mj.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), - Mj.register(Network, "Network", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), - Mj.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), - Nj(module)); + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = Network, Tj, Uj; + __webpack_exports__.a = _default, Tj = __webpack_require__("./node_modules/react-hot-loader/index.js").default, + Uj = __webpack_require__("./node_modules/react-hot-loader/index.js").leaveModule, + Tj && (Tj.register(inserter, "inserter", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + Tj.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + Tj.register(Network, "Network", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + Tj.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/Network.jsx"), + Uj(module)); }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); }, "./components/SideBar.jsx": function(module, __webpack_exports__, __webpack_require__) { "use strict"; (function(module) { - var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/List/index.js"), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_List__WEBPACK_IMPORTED_MODULE_2__), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/@material-ui/core/ListItem/index.js"), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(_material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3__), _material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./node_modules/@material-ui/core/ListItemIcon/index.js"), _material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4___default = __webpack_require__.n(_material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4__), _material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./node_modules/@material-ui/core/ListItemText/index.js"), _material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5___default = __webpack_require__.n(_material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5__), _material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./node_modules/@material-ui/core/Icon/index.js"), _material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6___default = __webpack_require__.n(_material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6__), react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./node_modules/react-transition-group/Transition.js"), react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7___default = __webpack_require__.n(react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7__), react_fa__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./node_modules/react-fa/lib/index.js"), react_fa__WEBPACK_IMPORTED_MODULE_8___default = __webpack_require__.n(react_fa__WEBPACK_IMPORTED_MODULE_8__), _common__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./common.jsx"), Oj; + var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("./node_modules/react/index.js"), react__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("./node_modules/@material-ui/core/styles/withStyles.js"), _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1__), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./node_modules/@material-ui/core/List/index.js"), _material_ui_core_List__WEBPACK_IMPORTED_MODULE_2___default = __webpack_require__.n(_material_ui_core_List__WEBPACK_IMPORTED_MODULE_2__), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./node_modules/@material-ui/core/ListItem/index.js"), _material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3___default = __webpack_require__.n(_material_ui_core_ListItem__WEBPACK_IMPORTED_MODULE_3__), _material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./node_modules/@material-ui/core/ListItemIcon/index.js"), _material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4___default = __webpack_require__.n(_material_ui_core_ListItemIcon__WEBPACK_IMPORTED_MODULE_4__), _material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./node_modules/@material-ui/core/ListItemText/index.js"), _material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5___default = __webpack_require__.n(_material_ui_core_ListItemText__WEBPACK_IMPORTED_MODULE_5__), _material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./node_modules/@material-ui/core/Icon/index.js"), _material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6___default = __webpack_require__.n(_material_ui_core_Icon__WEBPACK_IMPORTED_MODULE_6__), react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./node_modules/react-transition-group/Transition.js"), react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7___default = __webpack_require__.n(react_transition_group_Transition__WEBPACK_IMPORTED_MODULE_7__), react_fa__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./node_modules/react-fa/lib/index.js"), react_fa__WEBPACK_IMPORTED_MODULE_8___default = __webpack_require__.n(react_fa__WEBPACK_IMPORTED_MODULE_8__), _common__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./common.jsx"), Vj; function _typeof(e) { return (_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { return typeof e; @@ -1899,8 +1919,8 @@ var _bundleJs = []byte((((`!function(n) { writable: !0 }) : e[t] = n, e; } - Oj = __webpack_require__("./node_modules/react-hot-loader/index.js").enterModule, - Oj && Oj(module); + Vj = __webpack_require__("./node_modules/react-hot-loader/index.js").enterModule, + Vj && Vj(module); var styles = { menu: { default: { @@ -1981,14 +2001,14 @@ var _bundleJs = []byte((((`!function(n) { this[key] = eval(code); } } ]), SideBar; - }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default()(themeStyles)(SideBar), Qk, Rk; - __webpack_exports__.a = _default, Qk = __webpack_require__("./node_modules/react-hot-loader/index.js").default, - Rk = __webpack_require__("./node_modules/react-hot-loader/index.js").leaveModule, - Qk && (Qk.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), - Qk.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), - Qk.register(SideBar, "SideBar", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), - Qk.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), - Rk(module)); + }(react__WEBPACK_IMPORTED_MODULE_0__.Component), _default = _material_ui_core_styles_withStyles__WEBPACK_IMPORTED_MODULE_1___default()(themeStyles)(SideBar), Xk, Yk; + __webpack_exports__.a = _default, Xk = __webpack_require__("./node_modules/react-hot-loader/index.js").default, + Yk = __webpack_require__("./node_modules/react-hot-loader/index.js").leaveModule, + Xk && (Xk.register(styles, "styles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + Xk.register(themeStyles, "themeStyles", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + Xk.register(SideBar, "SideBar", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + Xk.register(_default, "default", "/home/misi/Work/src/github.com/ethereum/go-ethereum/dashboard/assets/components/SideBar.jsx"), + Yk(module)); }).call(this, __webpack_require__("./node_modules/webpack/buildin/harmony-module.js")(module)); }, "./index.jsx": function(e, t, h) { @@ -6134,7 +6154,7 @@ var _bundleJs = []byte((((`!function(n) { return n; } function D() {} - var R = 1 / .7, I = "\\s*([+-]?\\d+)\\s*", F = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", W = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", N = /^#([0-9a-f]{3})$/, L = /^#([0-9a-f]{6})$/, B = new RegExp("^rgb\\(" + [ I, I, I ] + "\\)$"), U = new RegExp("^rgb\\(" + [ W, W, W ] + "\\)$"), K = new RegExp("^rgba\\(" + [ I, I, I, F ] + "\\)$"), q = new RegExp("^rgba\\(" + [ W, W, W, F ] + "\\)$"), z = new RegExp("^hsl\\(" + [ F, W, W ] + "\\)$"), V = new RegExp("^hsla\\(" + [ F, W, W, F ] + "\\)$"), H = { + var R = 1 / .7, I = "\\s*([+-]?\\d+)\\s*", F = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", W = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", L = /^#([0-9a-f]{3})$/, N = /^#([0-9a-f]{6})$/, B = new RegExp("^rgb\\(" + [ I, I, I ] + "\\)$"), U = new RegExp("^rgb\\(" + [ W, W, W ] + "\\)$"), K = new RegExp("^rgba\\(" + [ I, I, I, F ] + "\\)$"), q = new RegExp("^rgba\\(" + [ W, W, W, F ] + "\\)$"), z = new RegExp("^hsl\\(" + [ F, W, W ] + "\\)$"), V = new RegExp("^hsla\\(" + [ F, W, W, F ] + "\\)$"), H = { aliceblue: 15792383, antiquewhite: 16444375, aqua: 65535, @@ -6286,7 +6306,7 @@ var _bundleJs = []byte((((`!function(n) { }; function X(e) { var t; - return e = (e + "").trim().toLowerCase(), (t = N.exec(e)) ? new Q((t = parseInt(t[1], 16)) >> 8 & 15 | t >> 4 & 240, t >> 4 & 15 | 240 & t, (15 & t) << 4 | 15 & t, 1) : (t = L.exec(e)) ? G(parseInt(t[1], 16)) : (t = B.exec(e)) ? new Q(t[1], t[2], t[3], 1) : (t = U.exec(e)) ? new Q(255 * t[1] / 100, 255 * t[2] / 100, 255 * t[3] / 100, 1) : (t = K.exec(e)) ? Y(t[1], t[2], t[3], t[4]) : (t = q.exec(e)) ? Y(255 * t[1] / 100, 255 * t[2] / 100, 255 * t[3] / 100, t[4]) : (t = z.exec(e)) ? $(t[1], t[2] / 100, t[3] / 100, 1) : (t = V.exec(e)) ? $(t[1], t[2] / 100, t[3] / 100, t[4]) : H.hasOwnProperty(e) ? G(H[e]) : "transparent" === e ? new Q(NaN, NaN, NaN, 0) : null; + return e = (e + "").trim().toLowerCase(), (t = L.exec(e)) ? new Q((t = parseInt(t[1], 16)) >> 8 & 15 | t >> 4 & 240, t >> 4 & 15 | 240 & t, (15 & t) << 4 | 15 & t, 1) : (t = N.exec(e)) ? G(parseInt(t[1], 16)) : (t = B.exec(e)) ? new Q(t[1], t[2], t[3], 1) : (t = U.exec(e)) ? new Q(255 * t[1] / 100, 255 * t[2] / 100, 255 * t[3] / 100, 1) : (t = K.exec(e)) ? Y(t[1], t[2], t[3], t[4]) : (t = q.exec(e)) ? Y(255 * t[1] / 100, 255 * t[2] / 100, 255 * t[3] / 100, t[4]) : (t = z.exec(e)) ? $(t[1], t[2] / 100, t[3] / 100, 1) : (t = V.exec(e)) ? $(t[1], t[2] / 100, t[3] / 100, t[4]) : H.hasOwnProperty(e) ? G(H[e]) : "transparent" === e ? new Q(NaN, NaN, NaN, 0) : null; } function G(e) { return new Q(e >> 16 & 255, e >> 8 & 255, 255 & e, 1); @@ -6511,21 +6531,21 @@ var _bundleJs = []byte((((`!function(n) { return Ae((e - t / s) * s, n, r, o, a); }; }); - var Ne = function(t, n) { + var Le = function(t, n) { return n -= t = +t, function(e) { return t + n * e; }; - }, Le = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, Be = new RegExp(Le.source, "g"); + }, Ne = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, Be = new RegExp(Ne.source, "g"); var Ue, Ke, qe, ze, Ve = function(e, t) { var n, r = typeof t; - return null == t || "boolean" === r ? Ce(t) : ("number" === r ? Ne : "string" === r ? (n = X(t)) ? (t = n, + return null == t || "boolean" === r ? Ce(t) : ("number" === r ? Le : "string" === r ? (n = X(t)) ? (t = n, Fe) : function(e, r) { - var t, n, o, a, i, s = Le.lastIndex = Be.lastIndex = 0, u = -1, l = [], c = []; - for (e += "", r += ""; (t = Le.exec(e)) && (n = Be.exec(r)); ) (o = n.index) > s && (o = r.slice(s, o), + var t, n, o, a, i, s = Ne.lastIndex = Be.lastIndex = 0, u = -1, l = [], c = []; + for (e += "", r += ""; (t = Ne.exec(e)) && (n = Be.exec(r)); ) (o = n.index) > s && (o = r.slice(s, o), l[u] ? l[u] += o : l[++u] = o), (t = t[0]) === (n = n[0]) ? l[u] ? l[u] += n : l[++u] = n : (l[++u] = null, c.push({ i: u, - x: Ne(t, n) + x: Le(t, n) })), s = Be.lastIndex; return s < r.length && (o = r.slice(s), l[u] ? l[u] += o : l[++u] = o), l.length < 2 ? c[0] ? (i = c[0].x, function(e) { @@ -6557,7 +6577,7 @@ var _bundleJs = []byte((((`!function(n) { for (n in r) o[n] = r[n](e); return o; }; - } : Ne)(e, t); + } : Le)(e, t); }, He = function(t, n) { return n -= t = +t, function(e) { return Math.round(t + n * e); @@ -6593,29 +6613,29 @@ var _bundleJs = []byte((((`!function(n) { var i = o.push("translate(", null, p, null, h); a.push({ i: i - 4, - x: Ne(e, n) + x: Le(e, n) }, { i: i - 2, - x: Ne(t, r) + x: Le(t, r) }); } else (n || r) && o.push("translate(" + n + p + r + h); }(e.translateX, e.translateY, t.translateX, t.translateY, c, f), n = e.rotate, r = t.rotate, o = c, a = f, n !== r ? (180 < n - r ? r += 360 : 180 < r - n && (n += 360), a.push({ i: o.push(b(o) + "rotate(", null, m) - 2, - x: Ne(n, r) + x: Le(n, r) })) : r && o.push(b(o) + "rotate(" + r + m), i = e.skewX, s = t.skewX, u = c, l = f, i !== s ? l.push({ i: u.push(b(u) + "skewX(", null, m) - 2, - x: Ne(i, s) + x: Le(i, s) }) : s && u.push(b(u) + "skewX(" + s + m), function(e, t, n, r, o, a) { if (e !== n || t !== r) { var i = o.push(b(o) + "scale(", null, ",", null, ")"); a.push({ i: i - 4, - x: Ne(e, n) + x: Le(e, n) }, { i: i - 2, - x: Ne(t, r) + x: Le(t, r) }); } else 1 === n && 1 === r || o.push(b(o) + "scale(" + n + "," + r + ")"); }(e.scaleX, e.scaleY, t.scaleX, t.scaleY, c, f), e = t = null, function(e) { @@ -6916,7 +6936,7 @@ var _bundleJs = []byte((((`!function(n) { }, s; } function Ot() { - var e = st(rt, Ne); + var e = st(rt, Le); return e.copy = function() { return it(e, Ot()); }, jt(e); @@ -7084,7 +7104,7 @@ var _bundleJs = []byte((((`!function(n) { return Wt().domain([ n, r ]).range(i); }, jt(t); } - function Nt() { + function Lt() { var n = [ .5 ], r = [ 0, 1 ], t = 1; function o(e) { if (e <= e) return r[u(n, e, 0, t)]; @@ -7099,10 +7119,10 @@ var _bundleJs = []byte((((`!function(n) { var t = r.indexOf(e); return [ n[t - 1], n[t] ]; }, o.copy = function() { - return Nt().domain(n).range(r); + return Lt().domain(n).range(r); }, o; } - var Lt = new Date(), Bt = new Date(); + var Nt = new Date(), Bt = new Date(); function Ut(a, i, n, r) { function s(e) { return a(e = new Date(+e)), e; @@ -7127,7 +7147,7 @@ var _bundleJs = []byte((((`!function(n) { !n(e); ) ; }); }, n && (s.count = function(e, t) { - return Lt.setTime(+e), Bt.setTime(+t), a(Lt), a(Bt), Math.floor(n(Lt, Bt)); + return Nt.setTime(+e), Bt.setTime(+t), a(Nt), a(Bt), Math.floor(n(Nt, Bt)); }, s.every = function(t) { return t = Math.floor(t), isFinite(t) && 0 < t ? 1 < t ? s.filter(r ? function(e) { return r(e) % t == 0; @@ -7306,11 +7326,11 @@ var _bundleJs = []byte((((`!function(n) { L: 0 }; } - var Rn, In, Fn, Wn, Nn = { + var Rn, In, Fn, Wn, Ln = { "-": "", _: " ", 0: "0" - }, Ln = /^\s*\d+/, Bn = /^%/, Un = /[\\^$*+?|[\]().{}]/g; + }, Nn = /^\s*\d+/, Bn = /^%/, Un = /[\\^$*+?|[\]().{}]/g; function Kn(e, t, n) { var r = e < 0 ? "-" : "", o = (r ? -e : e) + "", a = o.length; return r + (a < n ? new Array(n - a + 1).join(t) + o : o); @@ -7326,31 +7346,31 @@ var _bundleJs = []byte((((`!function(n) { return t; } function Hn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 1)); + var r = Nn.exec(t.slice(n, n + 1)); return r ? (e.w = +r[0], n + r[0].length) : -1; } function Xn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 1)); + var r = Nn.exec(t.slice(n, n + 1)); return r ? (e.u = +r[0], n + r[0].length) : -1; } function Gn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.U = +r[0], n + r[0].length) : -1; } function Yn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.V = +r[0], n + r[0].length) : -1; } function Jn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.W = +r[0], n + r[0].length) : -1; } function Zn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 4)); + var r = Nn.exec(t.slice(n, n + 4)); return r ? (e.y = +r[0], n + r[0].length) : -1; } function Qn(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.y = +r[0] + (68 < +r[0] ? 1900 : 2e3), n + r[0].length) : -1; } function $n(e, t, n) { @@ -7358,35 +7378,35 @@ var _bundleJs = []byte((((`!function(n) { return r ? (e.Z = r[1] ? 0 : -(r[2] + (r[3] || "00")), n + r[0].length) : -1; } function er(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.m = r[0] - 1, n + r[0].length) : -1; } function tr(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.d = +r[0], n + r[0].length) : -1; } function nr(e, t, n) { - var r = Ln.exec(t.slice(n, n + 3)); + var r = Nn.exec(t.slice(n, n + 3)); return r ? (e.m = 0, e.d = +r[0], n + r[0].length) : -1; } function rr(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.H = +r[0], n + r[0].length) : -1; } function or(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.M = +r[0], n + r[0].length) : -1; } function ar(e, t, n) { - var r = Ln.exec(t.slice(n, n + 2)); + var r = Nn.exec(t.slice(n, n + 2)); return r ? (e.S = +r[0], n + r[0].length) : -1; } function ir(e, t, n) { - var r = Ln.exec(t.slice(n, n + 3)); + var r = Nn.exec(t.slice(n, n + 3)); return r ? (e.L = +r[0], n + r[0].length) : -1; } function sr(e, t, n) { - var r = Ln.exec(t.slice(n, n + 6)); + var r = Nn.exec(t.slice(n, n + 6)); return r ? (e.L = Math.floor(r[0] / 1e3), n + r[0].length) : -1; } function ur(e, t, n) { @@ -7394,11 +7414,11 @@ var _bundleJs = []byte((((`!function(n) { return r ? n + r[0].length : -1; } function lr(e, t, n) { - var r = Ln.exec(t.slice(n)); + var r = Nn.exec(t.slice(n)); return r ? (e.Q = +r[0], n + r[0].length) : -1; } function cr(e, t, n) { - var r = Ln.exec(t.slice(n)); + var r = Nn.exec(t.slice(n)); return r ? (e.Q = 1e3 * +r[0], n + r[0].length) : -1; } function fr(e, t) { @@ -7486,10 +7506,10 @@ var _bundleJs = []byte((((`!function(n) { var t = e.getUTCDay(); return 0 === t ? 7 : t; } - function Nr(e, t) { + function Lr(e, t) { return Kn(gn.count(An(e), e), t, 2); } - function Lr(e, t) { + function Nr(e, t) { var n = e.getUTCDay(); return e = 4 <= n || 0 === n ? wn(e) : wn.ceil(e), Kn(wn.count(An(e), e) + (4 === An(e).getUTCDay()), t, 2); } @@ -7588,8 +7608,8 @@ var _bundleJs = []byte((((`!function(n) { s: Xr, S: Fr, u: Wr, - U: Nr, - V: Lr, + U: Lr, + V: Nr, w: Br, W: Ur, x: null, @@ -7654,7 +7674,7 @@ var _bundleJs = []byte((((`!function(n) { return function(e) { var t, n, r, o = [], a = -1, i = 0, s = u.length; for (e instanceof Date || (e = new Date(+e)); ++a < s; ) 37 === u.charCodeAt(a) && (o.push(u.slice(i, a)), - null != (n = Nn[t = u.charAt(++a)]) ? t = u.charAt(++a) : n = "e" === t ? " " : "0", + null != (n = Ln[t = u.charAt(++a)]) ? t = u.charAt(++a) : n = "e" === t ? " " : "0", (r = l[t]) && (t = r(e, n)), o.push(t), i = a + 1); return o.push(u.slice(i, a)), o.join(""); }; @@ -7679,7 +7699,7 @@ var _bundleJs = []byte((((`!function(n) { for (var o, a, i = 0, s = t.length, u = n.length; i < s; ) { if (u <= r) return -1; if (37 === (o = t.charCodeAt(i++))) { - if (o = t.charAt(i++), !(a = x[o in Nn ? t.charAt(i++) : o]) || (r = a(e, n, r)) < 0) return -1; + if (o = t.charAt(i++), !(a = x[o in Ln ? t.charAt(i++) : o]) || (r = a(e, n, r)) < 0) return -1; } else if (o != n.charCodeAt(r++)) return -1; } return r; @@ -7732,7 +7752,7 @@ var _bundleJs = []byte((((`!function(n) { return e instanceof Date ? +e : +new Date(+e); } function oo(i, t, n, r, o, a, s, u, l) { - var c = st(rt, Ne), f = c.invert, d = c.domain, p = l(".%L"), h = l(":%S"), m = l("%I:%M"), b = l("%I %p"), y = l("%a %d"), v = l("%b %d"), _ = l("%B"), g = l("%Y"), x = [ [ s, 1, Yr ], [ s, 5, 5 * Yr ], [ s, 15, 15 * Yr ], [ s, 30, 30 * Yr ], [ a, 1, Jr ], [ a, 5, 5 * Jr ], [ a, 15, 15 * Jr ], [ a, 30, 30 * Jr ], [ o, 1, Zr ], [ o, 3, 3 * Zr ], [ o, 6, 6 * Zr ], [ o, 12, 12 * Zr ], [ r, 1, Qr ], [ r, 2, 2 * Qr ], [ n, 1, $r ], [ t, 1, eo ], [ t, 3, 3 * eo ], [ i, 1, to ] ]; + var c = st(rt, Le), f = c.invert, d = c.domain, p = l(".%L"), h = l(":%S"), m = l("%I:%M"), b = l("%I %p"), y = l("%a %d"), v = l("%b %d"), _ = l("%B"), g = l("%Y"), x = [ [ s, 1, Yr ], [ s, 5, 5 * Yr ], [ s, 15, 15 * Yr ], [ s, 30, 30 * Yr ], [ a, 1, Jr ], [ a, 5, 5 * Jr ], [ a, 15, 15 * Jr ], [ a, 30, 30 * Jr ], [ o, 1, Zr ], [ o, 3, 3 * Zr ], [ o, 6, 6 * Zr ], [ o, 12, 12 * Zr ], [ r, 1, Qr ], [ r, 2, 2 * Qr ], [ n, 1, $r ], [ t, 1, eo ], [ t, 3, 3 * eo ], [ i, 1, to ] ]; function j(e) { return (s(e) < e ? p : a(e) < e ? h : o(e) < e ? m : r(e) < e ? b : t(e) < e ? n(e) < e ? y : v : i(e) < e ? _ : g)(e); } @@ -7825,7 +7845,7 @@ var _bundleJs = []byte((((`!function(n) { }), n.d(t, "scaleQuantize", function() { return Wt; }), n.d(t, "scaleThreshold", function() { - return Nt; + return Lt; }), n.d(t, "scaleTime", function() { return ao; }), n.d(t, "scaleUtc", function() { @@ -8067,7 +8087,7 @@ var _bundleJs = []byte((((`!function(n) { e.lineTo(-.5 * r + R * o, -.5 * o - R * r), e.lineTo(-.5 * a + R * i, -.5 * i - R * a), e.lineTo(-.5 * s + R * u, -.5 * u - R * s), e.closePath(); } - }, N = function() { + }, L = function() { var t = a(y), n = a(64), r = null; function o() { var e; @@ -8081,7 +8101,7 @@ var _bundleJs = []byte((((`!function(n) { }, o.context = function(e) { return arguments.length ? (r = null == e ? null : e, o) : r; }, o; - }, L = function() {}; + }, N = function() {}; function B(e, t, n) { e._context.bezierCurveTo((2 * e._x0 + e._x1) / 3, (2 * e._y0 + e._y1) / 3, (e._x0 + 2 * e._x1) / 3, (e._y0 + 2 * e._y1) / 3, (e._x0 + 4 * e._x1 + t) / 6, (e._y0 + 4 * e._y1 + n) / 6); } @@ -8135,8 +8155,8 @@ var _bundleJs = []byte((((`!function(n) { this._context = e; } q.prototype = { - areaStart: L, - areaEnd: L, + areaStart: N, + areaEnd: N, lineStart: function() { this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN, this._point = 0; @@ -8310,8 +8330,8 @@ var _bundleJs = []byte((((`!function(n) { this._context = e, this._k = (1 - t) / 6; } J.prototype = { - areaStart: L, - areaEnd: L, + areaStart: N, + areaEnd: N, lineStart: function() { this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._point = 0; @@ -8482,8 +8502,8 @@ var _bundleJs = []byte((((`!function(n) { this._context = e, this._alpha = t; } ee.prototype = { - areaStart: L, - areaEnd: L, + areaStart: N, + areaEnd: N, lineStart: function() { this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0; @@ -8594,8 +8614,8 @@ var _bundleJs = []byte((((`!function(n) { this._context = e; } ne.prototype = { - areaStart: L, - areaEnd: L, + areaStart: N, + areaEnd: N, lineStart: function() { this._point = 0; }, @@ -8849,7 +8869,7 @@ var _bundleJs = []byte((((`!function(n) { }), n.d(t, "m", function() { return u; }), n.d(t, "t", function() { - return N; + return L; }), n.d(t, "u", function() { return y; }), n.d(t, "v", function() { @@ -12445,10 +12465,10 @@ var _bundleJs = []byte((((`!function(n) { } return 7 === (e = e[R]).tag || 8 === e.tag ? e : null; } - function N(e) { + function L(e) { return !(e = e[R]) || 7 !== e.tag && 8 !== e.tag ? null : e; } - function L(e) { + function N(e) { if (7 === e.tag || 8 === e.tag) return e.stateNode; W("33"); } @@ -12723,7 +12743,7 @@ var _bundleJs = []byte((((`!function(n) { } function Fe() {} var We = !1; - function Ne(e, t) { + function Le(e, t) { if (We) return e(t); We = !0; try { @@ -12732,7 +12752,7 @@ var _bundleJs = []byte((((`!function(n) { We = !1, (null !== Me || null !== Ae) && (Fe(), De()); } } - var Le = { + var Ne = { color: !0, date: !0, datetime: !0, @@ -12751,7 +12771,7 @@ var _bundleJs = []byte((((`!function(n) { }; function Be(e) { var t = e && e.nodeName && e.nodeName.toLowerCase(); - return "input" === t ? !!Le[e.type] : "textarea" === t; + return "input" === t ? !!Ne[e.type] : "textarea" === t; } function Ue(e) { return (e = e.target || e.srcElement || window).correspondingUseElement && (e = e.correspondingUseElement), @@ -13015,7 +13035,7 @@ var _bundleJs = []byte((((`!function(n) { S(e, !1); } function At(e) { - if (Ve(L(e))) return e; + if (Ve(N(e))) return e; } function Ct(e, t) { if ("change" === e) return t; @@ -13025,7 +13045,7 @@ var _bundleJs = []byte((((`!function(n) { kt && (kt.detachEvent("onpropertychange", Rt), Tt = kt = null); } function Rt(e) { - "value" === e.propertyName && At(Tt) && Ne(Mt, e = Pt(Tt, e, Ue(e))); + "value" === e.propertyName && At(Tt) && Le(Mt, e = Pt(Tt, e, Ue(e))); } function It(e, t, n) { "focus" === e ? (Dt(), Tt = n, (kt = t).attachEvent("onpropertychange", Rt)) : "blur" === e && Dt(); @@ -13036,16 +13056,16 @@ var _bundleJs = []byte((((`!function(n) { function Wt(e, t) { if ("click" === e) return At(t); } - function Nt(e, t) { + function Lt(e, t) { if ("input" === e || "change" === e) return At(t); } X && (St = Ke("input") && (!document.documentMode || 9 < document.documentMode)); - var Lt = { + var Nt = { eventTypes: Et, _isInputEventSupported: St, extractEvents: function(e, t, n, r) { - var o = t ? L(t) : window, a = void 0, i = void 0, s = o.nodeName && o.nodeName.toLowerCase(); - if ("select" === s || "input" === s && "file" === o.type ? a = Ct : Be(o) ? St ? a = Nt : (a = Ft, + var o = t ? N(t) : window, a = void 0, i = void 0, s = o.nodeName && o.nodeName.toLowerCase(); + if ("select" === s || "input" === s && "file" === o.type ? a = Ct : Be(o) ? St ? a = Lt : (a = Ft, i = It) : (s = o.nodeName) && "input" === s.toLowerCase() && ("checkbox" === o.type || "radio" === o.type) && (a = Wt), a && (a = a(e, t))) return Pt(a, n, r); i && i(e, o, t), "blur" === e && (e = o._wrapperState) && e.controlled && "number" === o.type && wt(o, "number", o.value); @@ -13135,8 +13155,8 @@ var _bundleJs = []byte((((`!function(n) { "mouseout" === e || "mouseover" === e ? (i = Gt, s = Jt.mouseLeave, u = Jt.mouseEnter, l = "mouse") : "pointerout" !== e && "pointerover" !== e || (i = Yt, s = Jt.pointerLeave, u = Jt.pointerEnter, l = "pointer"); - var c = null == a ? o : L(a); - if (o = null == t ? o : L(t), (e = i.getPooled(s, a, n, r)).type = l + "leave", + var c = null == a ? o : N(a); + if (o = null == t ? o : N(t), (e = i.getPooled(s, a, n, r)).type = l + "leave", e.target = c, e.relatedTarget = o, (n = i.getPooled(u, t, n, r)).type = l + "enter", n.target = o, n.relatedTarget = c, r = t, a && r) e: { for (o = r, l = 0, i = t = a; i; i = U(i)) l++; @@ -13518,7 +13538,7 @@ var _bundleJs = []byte((((`!function(n) { ancestors: [] }; try { - Ne(On, e); + Le(On, e); } finally { e.topLevelType = null, e.nativeEvent = null, e.targetInst = null, e.ancestors.length = 0, jn.length < 10 && jn.push(e); @@ -13580,7 +13600,7 @@ var _bundleJs = []byte((((`!function(n) { var t = e && e.nodeName && e.nodeName.toLowerCase(); return t && ("input" === t && ("text" === e.type || "search" === e.type || "tel" === e.type || "url" === e.type || "password" === e.type) || "textarea" === t || "true" === e.contentEditable); } - var Nn = X && "documentMode" in document && document.documentMode <= 11, Ln = { + var Ln = X && "documentMode" in document && document.documentMode <= 11, Nn = { select: { phasedRegistrationNames: { bubbled: "onSelect", @@ -13599,11 +13619,11 @@ var _bundleJs = []byte((((`!function(n) { anchorOffset: n.anchorOffset, focusNode: n.focusNode, focusOffset: n.focusOffset - }, Kn && en(Kn, n) ? null : (Kn = n, (e = ce.getPooled(Ln.select, Un, e, t)).type = "select", + }, Kn && en(Kn, n) ? null : (Kn = n, (e = ce.getPooled(Nn.select, Un, e, t)).type = "select", e.target = Bn, H(e), e)); } var Vn = { - eventTypes: Ln, + eventTypes: Nn, extractEvents: function(e, t, n, r) { var o, a = r.window === r ? r.document : 9 === r.nodeType ? r : r.ownerDocument; if (!(o = !a)) { @@ -13621,7 +13641,7 @@ var _bundleJs = []byte((((`!function(n) { o = !a; } if (o) return null; - switch (a = t ? L(t) : window, e) { + switch (a = t ? N(t) : window, e) { case "focus": (Be(a) || "true" === a.contentEditable) && (Bn = a, Un = t, Kn = null); break; @@ -13640,7 +13660,7 @@ var _bundleJs = []byte((((`!function(n) { return qn = !1, zn(n, r); case "selectionchange": - if (Nn) break; + if (Ln) break; case "keydown": case "keyup": @@ -13696,10 +13716,10 @@ var _bundleJs = []byte((((`!function(n) { t === e._wrapperState.initialValue && (e.value = t); } A.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")), - i = B, s = N, j = L, A.injectEventPluginsByName({ + i = B, s = L, j = N, A.injectEventPluginsByName({ SimpleEventPlugin: gn, EnterLeaveEventPlugin: Zt, - ChangeEventPlugin: Lt, + ChangeEventPlugin: Nt, SelectEventPlugin: Vn, BeforeInputEventPlugin: ke }); @@ -13953,18 +13973,18 @@ var _bundleJs = []byte((((`!function(n) { } catch (e) {} }; } - function Nr(e, t, n, r) { + function Lr(e, t, n, r) { this.tag = e, this.key = n, this.sibling = this.child = this.return = this.stateNode = this.type = null, this.index = 0, this.ref = null, this.pendingProps = t, this.firstContextDependency = this.memoizedState = this.updateQueue = this.memoizedProps = null, this.mode = r, this.effectTag = 0, this.lastEffect = this.firstEffect = this.nextEffect = null, this.childExpirationTime = this.expirationTime = 0, this.alternate = null; } - function Lr(e) { + function Nr(e) { return !(!(e = e.prototype) || !e.isReactComponent); } function Br(e, t, n) { var r = e.alternate; - return null === r ? ((r = new Nr(e.tag, t, e.key, e.mode)).type = e.type, r.stateNode = e.stateNode, + return null === r ? ((r = new Lr(e.tag, t, e.key, e.mode)).type = e.type, r.stateNode = e.stateNode, (r.alternate = e).alternate = r) : (r.pendingProps = t, r.effectTag = 0, r.nextEffect = null, r.firstEffect = null, r.lastEffect = null), r.childExpirationTime = e.childExpirationTime, r.expirationTime = t !== e.pendingProps ? n : e.expirationTime, r.child = e.child, @@ -13976,7 +13996,7 @@ var _bundleJs = []byte((((`!function(n) { var r = e.type, o = e.key; e = e.props; var a = void 0; - if ("function" == typeof r) a = Lr(r) ? 2 : 4; else if ("string" == typeof r) a = 7; else e: switch (r) { + if ("function" == typeof r) a = Nr(r) ? 2 : 4; else if ("string" == typeof r) a = 7; else e: switch (r) { case Ze: return Kr(e.children, t, n, o); @@ -13989,7 +14009,7 @@ var _bundleJs = []byte((((`!function(n) { break; case $e: - return (r = new Nr(15, e, o, 4 | t)).type = $e, r.expirationTime = n, r; + return (r = new Lr(15, e, o, 4 | t)).type = $e, r.expirationTime = n, r; case ot: a = 16; @@ -14017,16 +14037,16 @@ var _bundleJs = []byte((((`!function(n) { } W("130", null == r ? r : typeof r, ""); } - return (t = new Nr(a, e, o, t)).type = r, t.expirationTime = n, t; + return (t = new Lr(a, e, o, t)).type = r, t.expirationTime = n, t; } function Kr(e, t, n, r) { - return (e = new Nr(9, e, r, t)).expirationTime = n, e; + return (e = new Lr(9, e, r, t)).expirationTime = n, e; } function qr(e, t, n) { - return (e = new Nr(8, e, null, t)).expirationTime = n, e; + return (e = new Lr(8, e, null, t)).expirationTime = n, e; } function zr(e, t, n) { - return (t = new Nr(6, null !== e.children ? e.children : [], e.key, t)).expirationTime = n, + return (t = new Lr(6, null !== e.children ? e.children : [], e.key, t)).expirationTime = n, t.stateNode = { containerInfo: e.containerInfo, pendingChildren: null, @@ -14475,9 +14495,9 @@ var _bundleJs = []byte((((`!function(n) { return p(e, t); }; } - var Ro = Do(!0), Io = Do(!1), Fo = null, Wo = null, No = !1; - function Lo(e, t) { - var n = new Nr(7, null, null, 0); + var Ro = Do(!0), Io = Do(!1), Fo = null, Wo = null, Lo = !1; + function No(e, t) { + var n = new Lr(7, null, null, 0); n.type = "DELETED", n.stateNode = t, n.return = e, n.effectTag = 8, null !== e.lastEffect ? (e.lastEffect.nextEffect = n, e.lastEffect = n) : e.firstEffect = e.lastEffect = n; } @@ -14497,16 +14517,16 @@ var _bundleJs = []byte((((`!function(n) { } } function Uo(e) { - if (No) { + if (Lo) { var t = Wo; if (t) { var n = t; if (!Bo(e, t)) { - if (!(t = yr(n)) || !Bo(e, t)) return e.effectTag |= 2, No = !1, void (Fo = e); - Lo(Fo, n); + if (!(t = yr(n)) || !Bo(e, t)) return e.effectTag |= 2, Lo = !1, void (Fo = e); + No(Fo, n); } Fo = e, Wo = vr(t); - } else e.effectTag |= 2, No = !1, Fo = e; + } else e.effectTag |= 2, Lo = !1, Fo = e; } } function Ko(e) { @@ -14515,14 +14535,14 @@ var _bundleJs = []byte((((`!function(n) { } function qo(e) { if (e !== Fo) return !1; - if (!No) return Ko(e), !(No = !0); + if (!Lo) return Ko(e), !(Lo = !0); var t = e.type; - if (7 !== e.tag || "head" !== t && "body" !== t && !br(t, e.memoizedProps)) for (t = Wo; t; ) Lo(e, t), + if (7 !== e.tag || "head" !== t && "body" !== t && !br(t, e.memoizedProps)) for (t = Wo; t; ) No(e, t), t = yr(t); return Ko(e), Wo = Fo ? yr(e.stateNode) : null, !0; } function zo() { - Wo = Fo = null, No = !1; + Wo = Fo = null, Lo = !1; } var Vo = He.ReactCurrentOwner; function Ho(e, t, n, r) { @@ -14673,7 +14693,7 @@ var _bundleJs = []byte((((`!function(n) { }), n; } }(n); - a = "function" == typeof a ? Lr(a) ? 3 : 1 : null != a && a.$$typeof ? 14 : 4, a = t.tag = a; + a = "function" == typeof a ? Nr(a) ? 3 : 1 : null != a && a.$$typeof ? 14 : 4, a = t.tag = a; var i = $o(n, o); switch (a) { case 1: @@ -14715,7 +14735,7 @@ var _bundleJs = []byte((((`!function(n) { return Qo(t), null === (r = t.updateQueue) && W("282"), o = null !== (o = t.memoizedState) ? o.element : null, no(t, r, t.pendingProps, null, n), t = (r = t.memoizedState.element) === o ? (zo(), ea(e, t, n)) : (o = t.stateNode, (o = (null === e || null === e.child) && o.hydrate) && (Wo = vr(t.stateNode.containerInfo), - Fo = t, o = No = !0), o ? (t.effectTag |= 2, t.child = Io(t, null, r, n)) : (Ho(e, t, r, n), + Fo = t, o = Lo = !0), o ? (t.effectTag |= 2, t.child = Io(t, null, r, n)) : (Ho(e, t, r, n), zo()), t.child); case 7: @@ -15510,16 +15530,16 @@ var _bundleJs = []byte((((`!function(n) { _a = a; } } - var Fa = null, Wa = null, Na = 0, La = void 0, Ba = !1, Ua = null, Ka = 0, qa = 0, za = !1, Va = !1, Ha = null, Xa = null, Ga = !1, Ya = !1, Ja = !1, Za = null, Qa = r.unstable_now(), $a = 2 + (Qa / 10 | 0), ei = $a, ti = 50, ni = 0, ri = null, oi = 1; + var Fa = null, Wa = null, La = 0, Na = void 0, Ba = !1, Ua = null, Ka = 0, qa = 0, za = !1, Va = !1, Ha = null, Xa = null, Ga = !1, Ya = !1, Ja = !1, Za = null, Qa = r.unstable_now(), $a = 2 + (Qa / 10 | 0), ei = $a, ti = 50, ni = 0, ri = null, oi = 1; function ai() { $a = 2 + ((r.unstable_now() - Qa) / 10 | 0); } function ii(e, t) { - if (0 !== Na) { - if (Na < t) return; - null !== La && r.unstable_cancelScheduledWork(La); + if (0 !== La) { + if (La < t) return; + null !== Na && r.unstable_cancelScheduledWork(Na); } - Na = t, e = r.unstable_now() - Qa, La = r.unstable_scheduleWork(li, { + La = t, e = r.unstable_now() - Qa, Na = r.unstable_scheduleWork(li, { timeout: 10 * (t - 2) - e }); } @@ -15566,7 +15586,7 @@ var _bundleJs = []byte((((`!function(n) { if (Xa = t, ui(), null !== Xa) for (ai(), ei = $a; null !== Ua && 0 !== Ka && (0 === e || Ka <= e) && (!za || Ka <= $a); ) fi(Ua, Ka, Ka <= $a), ui(), ai(), ei = $a; else for (;null !== Ua && 0 !== Ka && (0 === e || Ka <= e); ) fi(Ua, Ka, !0), ui(); - if (null !== Xa && (Na = 0, La = null), 0 !== Ka && ii(Ua, Ka), za = !1, ni = 0, + if (null !== Xa && (La = 0, Na = null), 0 !== Ka && ii(Ua, Ka), za = !1, ni = 0, (ri = Xa = null) !== Za) for (e = Za, Za = null, t = 0; t < e.length; t++) { var n = e[t]; try { @@ -15905,7 +15925,7 @@ var _bundleJs = []byte((((`!function(n) { } function Oi(e, t, n) { e = { - current: t = new Nr(5, null, null, t ? 3 : 0), + current: t = new Lr(5, null, null, t ? 3 : 0), containerInfo: e, pendingChildren: null, earliestPendingTime: 0, @@ -16108,7 +16128,7 @@ var _bundleJs = []byte((((`!function(n) { } }, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: { - Events: [ N, L, B, A.injectEventPluginsByName, g, H, function(e) { + Events: [ L, N, B, A.injectEventPluginsByName, g, H, function(e) { E(e, V); }, Se, De, Tn, S ] }, @@ -16691,7 +16711,7 @@ var _bundleJs = []byte((((`!function(n) { var t = I(n, r); return F(t, e); }; - }, N = function() { + }, L = function() { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) t[n] = arguments[n]; var r = t[0], o = t[1], a = t[2], i = t[3]; if (1 === t.length) switch (t[0]) { @@ -16731,7 +16751,7 @@ var _bundleJs = []byte((((`!function(n) { return c(r); }; return d.isStepper = !1, d; - }, L = function() { + }, N = function() { for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) t[n] = arguments[n]; var r = t[0]; if ("string" == typeof r) switch (r) { @@ -16740,7 +16760,7 @@ var _bundleJs = []byte((((`!function(n) { case "ease-out": case "ease-in": case "linear": - return N(r); + return L(r); case "spring": return function() { @@ -17010,7 +17030,7 @@ var _bundleJs = []byte((((`!function(n) { }, { key: "runJSAnimation", value: function(e) { - var t = this, n = e.from, r = e.to, o = e.duration, a = e.easing, i = e.begin, s = e.onAnimationEnd, u = e.onAnimationStart, l = Z(n, r, L(a), o, this.changeStyle); + var t = this, n = e.from, r = e.to, o = e.duration, a = e.easing, i = e.begin, s = e.onAnimationEnd, u = e.onAnimationStart, l = Z(n, r, N(a), o, this.changeStyle); this.manager.start([ u, i, function() { t.stopJSAnimation = l(); }, o, s ]); @@ -19620,7 +19640,7 @@ var _bundleJs = []byte((((`!function(n) { return e.__proto__ = t, e; })(e, t); } - var N = Object(T.a)((P = E = function(e) { + var L = Object(T.a)((P = E = function(e) { function a() { var e, n; !function(e, t) { @@ -19880,7 +19900,7 @@ var _bundleJs = []byte((((`!function(n) { var s = Math.max(i[0], i[1]), u = Math.min(i[0], i[1]); return "dataMin" === o ? u : "dataMax" === o ? s : s < 0 ? s : Math.max(Math.min(i[0], i[1]), 0); }, E.getComposedData = function(e) { - var t, n = e.props, r = e.xAxis, o = e.yAxis, a = e.xAxisTicks, i = e.yAxisTicks, s = e.bandSize, u = e.dataKey, l = e.stackedData, c = e.dataStartIndex, f = e.displayedData, d = e.offset, p = n.layout, h = l && l.length, m = N.getBaseValue(n, r, o), b = !1, y = f.map(function(e, t) { + var t, n = e.props, r = e.xAxis, o = e.yAxis, a = e.xAxisTicks, i = e.yAxisTicks, s = e.bandSize, u = e.dataKey, l = e.stackedData, c = e.dataStartIndex, f = e.displayedData, d = e.offset, p = n.layout, h = l && l.length, m = L.getBaseValue(n, r, o), b = !1, y = f.map(function(e, t) { var n; return h ? n = l[c + t] : (n = Object(j.t)(e, u), g.a.isArray(n) ? b = !0 : n = [ m, n ]), "horizontal" === p ? { @@ -19926,7 +19946,7 @@ var _bundleJs = []byte((((`!function(n) { className: "recharts-area-dot" })); }, w = P)) || w; - t.a = N; + t.a = L; }, "./node_modules/recharts/es6/chart/AreaChart.js": function(e, t, n) { "use strict"; @@ -20067,12 +20087,12 @@ var _bundleJs = []byte((((`!function(n) { return e.__proto__ || Object.getPrototypeOf(e); })(e); } - function N(e, t) { - return (N = Object.setPrototypeOf || function(e, t) { + function L(e, t) { + return (L = Object.setPrototypeOf || function(e, t) { return e.__proto__ = t, e; })(e, t); } - var L = function(e) { + var N = function(e) { var t = e.cx, n = e.cy, r = e.radius, o = e.angle, a = e.sign, i = e.isExternal, s = e.cornerRadius, u = s * (i ? 1 : -1) + r, l = Math.asin(s / u) / A.a, c = o + a * l; return { center: Object(A.c)(t, n, u, c), @@ -20103,7 +20123,7 @@ var _bundleJs = []byte((((`!function(n) { writable: !0, configurable: !0 } - }), t && N(e, t); + }), t && L(e, t); }(t, O["Component"]), n = t, (r = [ { key: "render", value: function() { @@ -20111,14 +20131,14 @@ var _bundleJs = []byte((((`!function(n) { if (o < r || i === s) return null; var l, c = y()("recharts-sector", u), f = o - r, d = Object(M.c)(a, f, 0, !0); return l = 0 < d && Math.abs(i - s) < 360 ? function(e) { - var t = e.cx, n = e.cy, r = e.innerRadius, o = e.outerRadius, a = e.cornerRadius, i = e.startAngle, s = e.endAngle, u = Object(M.i)(s - i), l = L({ + var t = e.cx, n = e.cy, r = e.innerRadius, o = e.outerRadius, a = e.cornerRadius, i = e.startAngle, s = e.endAngle, u = Object(M.i)(s - i), l = N({ cx: t, cy: n, radius: o, angle: i, sign: u, cornerRadius: a - }), c = l.circleTangency, f = l.lineTangency, d = l.theta, p = L({ + }), c = l.circleTangency, f = l.lineTangency, d = l.theta, p = N({ cx: t, cy: n, radius: o, @@ -20136,7 +20156,7 @@ var _bundleJs = []byte((((`!function(n) { }); var v = "M ".concat(f.x, ",").concat(f.y, "\n A").concat(a, ",").concat(a, ",0,0,").concat(+(u < 0), ",").concat(c.x, ",").concat(c.y, "\n A").concat(o, ",").concat(o, ",0,").concat(+(180 < y), ",").concat(+(u < 0), ",").concat(h.x, ",").concat(h.y, "\n A").concat(a, ",").concat(a, ",0,0,").concat(+(u < 0), ",").concat(m.x, ",").concat(m.y, "\n "); if (0 < r) { - var _ = L({ + var _ = N({ cx: t, cy: n, radius: r, @@ -20144,7 +20164,7 @@ var _bundleJs = []byte((((`!function(n) { sign: u, isExternal: !0, cornerRadius: a - }), g = _.circleTangency, x = _.lineTangency, j = _.theta, O = L({ + }), g = _.circleTangency, x = _.lineTangency, j = _.theta, O = N({ cx: t, cy: n, radius: r, @@ -21058,7 +21078,7 @@ var _bundleJs = []byte((((`!function(n) { }, We = { x: 0, y: 0 - }, Ne = function(e) { + }, Le = function(e) { var g = e.chartName, x = e.GraphicalChild, t = e.eventType, b = void 0 === t ? "axis" : t, R = e.axisComponents, d = e.legendContent, j = e.formatAxisMap, n = e.defaultProps, r = e.propTypes, o = function(e) { function o(e) { var x, t, n; @@ -22045,7 +22065,7 @@ var _bundleJs = []byte((((`!function(n) { var s = e.data; return s && s.length && Object(M.g)(o) && Object(M.g)(a) ? s.slice(o, a + 1) : []; }, o; - }, Le = n("./node_modules/recharts/es6/cartesian/Area.js"); + }, Ne = n("./node_modules/recharts/es6/cartesian/Area.js"); function Be(e) { return (Be = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { return typeof e; @@ -22250,9 +22270,9 @@ var _bundleJs = []byte((((`!function(n) { scale: "auto", reversed: !1 }, Ve = Xe)) || Ve, tt = n("./node_modules/recharts/es6/util/CartesianUtils.js"); - t.a = Ne({ + t.a = Le({ chartName: "AreaChart", - GraphicalChild: Le.a, + GraphicalChild: Ne.a, axisComponents: [ { axisType: "xAxis", AxisComp: Ge @@ -22707,7 +22727,7 @@ var _bundleJs = []byte((((`!function(n) { return e.__proto__ = t, e; })(e, t); } - var W, N, L, B = y.b.filter(function(e) { + var W, L, N, B = y.b.filter(function(e) { return "none" !== e; }), U = Object(d.a)((P = E = function(e) { function t() { @@ -22884,7 +22904,7 @@ var _bundleJs = []byte((((`!function(n) { } var J = y.b.filter(function(e) { return "none" !== e; - }), Z = Object(d.a)((L = N = function(e) { + }), Z = Object(d.a)((N = L = function(e) { function a() { var e, t; !function(e, t) { @@ -22995,7 +23015,7 @@ var _bundleJs = []byte((((`!function(n) { }, (e = o, t = this.props, f.a.isValidElement(e) ? f.a.cloneElement(e, t) : c.a.isFunction(e) ? e(t) : f.a.createElement(U, t))); } } ]) && H(t.prototype, n), r && H(t, r), a; - }(), N.displayName = "Legend", N.propTypes = { + }(), L.displayName = "Legend", L.propTypes = { content: u.a.oneOfType([ u.a.element, u.a.func ]), wrapperStyle: u.a.object, chartWidth: u.a.number, @@ -23023,12 +23043,12 @@ var _bundleJs = []byte((((`!function(n) { onMouseLeave: u.a.func, onClick: u.a.func, onBBoxUpdate: u.a.func - }, N.defaultProps = { + }, L.defaultProps = { iconSize: 14, layout: "horizontal", align: "center", verticalAlign: "bottom" - }, W = L)) || W; + }, W = N)) || W; t.a = Z; }, "./node_modules/recharts/es6/component/ResponsiveContainer.js": function(e, t, n) { @@ -23586,7 +23606,7 @@ var _bundleJs = []byte((((`!function(n) { return e.__proto__ = t, e; })(e, t); } - var W = "recharts-tooltip-wrapper", N = { + var W = "recharts-tooltip-wrapper", L = { content: u.a.oneOfType([ u.a.element, u.a.func ]), viewBox: u.a.shape({ x: u.a.number, @@ -23623,7 +23643,7 @@ var _bundleJs = []byte((((`!function(n) { itemSorter: u.a.func, filterNull: u.a.bool, useTranslate3d: u.a.bool - }, L = { + }, N = { active: !1, offset: 10, viewBox: { @@ -23735,7 +23755,7 @@ var _bundleJs = []byte((((`!function(n) { }), E.a.isValidElement(j) ? E.a.cloneElement(j, O) : k.a.isFunction(j) ? j(O) : E.a.createElement(A, O))); } } ]) && D(t.prototype, n), r && D(t, r), a; - }(), g.displayName = "Tooltip", g.propTypes = N, g.defaultProps = L, _ = x)) || _; + }(), g.displayName = "Tooltip", g.propTypes = L, g.defaultProps = N, _ = x)) || _; t.a = B; }, "./node_modules/recharts/es6/container/Layer.js": function(e, t, n) { @@ -24577,18 +24597,18 @@ var _bundleJs = []byte((((`!function(n) { return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e; })(e); } - function N(t) { + function L(t) { for (var e = 1; e < arguments.length; e++) { var n = null != arguments[e] ? arguments[e] : {}, r = Object.keys(n); "function" == typeof Object.getOwnPropertySymbols && (r = r.concat(Object.getOwnPropertySymbols(n).filter(function(e) { return Object.getOwnPropertyDescriptor(n, e).enumerable; }))), r.forEach(function(e) { - L(t, e, n[e]); + N(t, e, n[e]); }); } return t; } - function L(e, t, n) { + function N(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, @@ -24714,7 +24734,7 @@ var _bundleJs = []byte((((`!function(n) { y: a.scale }), f = Object(P.f)(t), d = Object(P.f)(n), p = r && 2 === r.length, h = this.getEndPoints(c, f, d, p); if (!h) return null; - var m, b, y = B(h, 2), v = y[0], _ = v.x, g = v.y, x = y[1], j = x.x, O = x.y, w = N({ + var m, b, y = B(h, 2), v = y[0], _ = v.x, g = v.y, x = y[1], j = x.x, O = x.y, w = L({ clipPath: Ue(this.props, "hidden") ? "url(#".concat(l, ")") : void 0 }, Object(A.j)(this.props), Object(A.e)(this.props), { x1: _, @@ -24734,7 +24754,7 @@ var _bundleJs = []byte((((`!function(n) { }))); } } ]) && U(n.prototype, r), o && U(n, o), t; - }(), R.displayName = "ReferenceLine", R.propTypes = N({}, A.c, { + }(), R.displayName = "ReferenceLine", R.propTypes = L({}, A.c, { viewBox: c.a.shape({ x: c.a.number, y: c.a.number, @@ -25142,9 +25162,9 @@ var _bundleJs = []byte((((`!function(n) { }), n.d(t, "c", function() { return Fe; }), n.d(t, "p", function() { - return Ne; - }), n.d(t, "s", function() { return Le; + }), n.d(t, "s", function() { + return Ne; }), n.d(t, "i", function() { return Be; }), n.d(t, "u", function() { @@ -25465,7 +25485,7 @@ var _bundleJs = []byte((((`!function(n) { none: p.p, silhouette: p.q, wiggle: p.r - }, Ne = function(u, e, l, c, f, t) { + }, Le = function(u, e, l, c, f, t) { if (!u) return null; var n = (t ? e.reverse() : e).reduce(function(e, t) { var n = t.props, r = n.stackId; @@ -25504,7 +25524,7 @@ var _bundleJs = []byte((((`!function(n) { })); }, {})), ve({}, e, _e({}, t, s)); }, {}); - }, Le = function(e, t) { + }, Ne = function(e, t) { var n, r = t.realScaleType, o = t.type, a = t.tickCount, i = t.originalDomain, s = t.allowDecimals, u = r || t.scale; if ("auto" !== u && "linear" !== u) return null; if (a && "number" === o && i && ("auto" === i[0] || "auto" === i[1])) { @@ -26129,10 +26149,10 @@ var _bundleJs = []byte((((`!function(n) { }; }, "./node_modules/recharts/node_modules/lodash/lodash.js": function(e, K, q) { - (function(L, B) { + (function(N, B) { var U; (function() { - var ti, ni = "Expected a function", ri = "__lodash_hash_undefined__", oi = "__lodash_placeholder__", ai = 9007199254740991, ii = NaN, si = 4294967295, ui = [ [ "ary", 128 ], [ "bind", 1 ], [ "bindKey", 2 ], [ "curry", 8 ], [ "curryRight", 16 ], [ "flip", 512 ], [ "partial", 32 ], [ "partialRight", 64 ], [ "rearg", 256 ] ], li = "[object Arguments]", ci = "[object Array]", fi = "[object Boolean]", di = "[object Date]", pi = "[object Error]", hi = "[object Function]", mi = "[object GeneratorFunction]", bi = "[object Map]", yi = "[object Number]", vi = "[object Object]", _i = "[object Promise]", gi = "[object RegExp]", xi = "[object Set]", ji = "[object String]", Oi = "[object Symbol]", wi = "[object WeakMap]", Ei = "[object ArrayBuffer]", Pi = "[object DataView]", ki = "[object Float32Array]", Ti = "[object Float64Array]", Mi = "[object Int8Array]", Ai = "[object Int16Array]", Ci = "[object Int32Array]", Si = "[object Uint8Array]", Di = "[object Uint8ClampedArray]", Ri = "[object Uint16Array]", Ii = "[object Uint32Array]", Fi = /\b__p \+= '';/g, Wi = /\b(__p \+=) '' \+/g, Ni = /(__e\(.*?\)|\b__t\)) \+\n'';/g, Li = /&(?:amp|lt|gt|quot|#39);/g, Bi = /[&<>"']/g, Ui = RegExp(Li.source), Ki = RegExp(Bi.source), qi = /<%-([\s\S]+?)%>/g, zi = /<%([\s\S]+?)%>/g, Vi = /<%=([\s\S]+?)%>/g, Hi = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, Xi = /^\w*$/, Gi = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, Yi = /[\\^$.*+?()[\]{}|]/g, Ji = RegExp(Yi.source), Zi = /^\s+|\s+$/g, Qi = /^\s+/, $i = /\s+$/, es = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, ts = /\{\n\/\* \[wrapped with (.+)\] \*/, ns = /,? & /, rs = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g, os = /\\(\\)?/g, as = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g, is = /\w*$/, ss = /^[-+]0x[0-9a-f]+$/i, us = /^0b[01]+$/i, ls = /^\[object .+?Constructor\]$/, cs = /^0o[0-7]+$/i, fs = /^(?:0|[1-9]\d*)$/, ds = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g, ps = /($^)/, hs = /['\n\r\u2028\u2029\\]/g, e = "\\ud800-\\udfff", t = "\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff", n = "\\u2700-\\u27bf", r = "a-z\\xdf-\\xf6\\xf8-\\xff", o = "A-Z\\xc0-\\xd6\\xd8-\\xde", a = "\\ufe0e\\ufe0f", i = "\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", s = "[" + e + "]", u = "[" + i + "]", l = "[" + t + "]", c = "\\d+", f = "[" + n + "]", d = "[" + r + "]", p = "[^" + e + i + c + n + r + o + "]", h = "\\ud83c[\\udffb-\\udfff]", m = "[^" + e + "]", b = "(?:\\ud83c[\\udde6-\\uddff]){2}", y = "[\\ud800-\\udbff][\\udc00-\\udfff]", v = "[" + o + "]", _ = "(?:" + d + "|" + p + ")", g = "(?:" + v + "|" + p + ")", x = "(?:['’](?:d|ll|m|re|s|t|ve))?", j = "(?:['’](?:D|LL|M|RE|S|T|VE))?", O = "(?:" + l + "|" + h + ")" + "?", w = "[" + a + "]?", E = w + O + ("(?:\\u200d(?:" + [ m, b, y ].join("|") + ")" + w + O + ")*"), P = "(?:" + [ f, b, y ].join("|") + ")" + E, k = "(?:" + [ m + l + "?", l, b, y, s ].join("|") + ")", ms = RegExp("['’]", "g"), bs = RegExp(l, "g"), T = RegExp(h + "(?=" + h + ")|" + k + E, "g"), ys = RegExp([ v + "?" + d + "+" + x + "(?=" + [ u, v, "$" ].join("|") + ")", g + "+" + j + "(?=" + [ u, v + _, "$" ].join("|") + ")", v + "?" + _ + "+" + x, v + "+" + j, "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", c, P ].join("|"), "g"), M = RegExp("[\\u200d" + e + t + a + "]"), vs = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/, _s = [ "Array", "Buffer", "DataView", "Date", "Error", "Float32Array", "Float64Array", "Function", "Int8Array", "Int16Array", "Int32Array", "Map", "Math", "Object", "Promise", "RegExp", "Set", "String", "Symbol", "TypeError", "Uint8Array", "Uint8ClampedArray", "Uint16Array", "Uint32Array", "WeakMap", "_", "clearTimeout", "isFinite", "parseInt", "setTimeout" ], gs = -1, xs = {}; + var ti, ni = "Expected a function", ri = "__lodash_hash_undefined__", oi = "__lodash_placeholder__", ai = 9007199254740991, ii = NaN, si = 4294967295, ui = [ [ "ary", 128 ], [ "bind", 1 ], [ "bindKey", 2 ], [ "curry", 8 ], [ "curryRight", 16 ], [ "flip", 512 ], [ "partial", 32 ], [ "partialRight", 64 ], [ "rearg", 256 ] ], li = "[object Arguments]", ci = "[object Array]", fi = "[object Boolean]", di = "[object Date]", pi = "[object Error]", hi = "[object Function]", mi = "[object GeneratorFunction]", bi = "[object Map]", yi = "[object Number]", vi = "[object Object]", _i = "[object Promise]", gi = "[object RegExp]", xi = "[object Set]", ji = "[object String]", Oi = "[object Symbol]", wi = "[object WeakMap]", Ei = "[object ArrayBuffer]", Pi = "[object DataView]", ki = "[object Float32Array]", Ti = "[object Float64Array]", Mi = "[object Int8Array]", Ai = "[object Int16Array]", Ci = "[object Int32Array]", Si = "[object Uint8Array]", Di = "[object Uint8ClampedArray]", Ri = "[object Uint16Array]", Ii = "[object Uint32Array]", Fi = /\b__p \+= '';/g, Wi = /\b(__p \+=) '' \+/g, Li = /(__e\(.*?\)|\b__t\)) \+\n'';/g, Ni = /&(?:amp|lt|gt|quot|#39);/g, Bi = /[&<>"']/g, Ui = RegExp(Ni.source), Ki = RegExp(Bi.source), qi = /<%-([\s\S]+?)%>/g, zi = /<%([\s\S]+?)%>/g, Vi = /<%=([\s\S]+?)%>/g, Hi = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, Xi = /^\w*$/, Gi = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, Yi = /[\\^$.*+?()[\]{}|]/g, Ji = RegExp(Yi.source), Zi = /^\s+|\s+$/g, Qi = /^\s+/, $i = /\s+$/, es = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, ts = /\{\n\/\* \[wrapped with (.+)\] \*/, ns = /,? & /, rs = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g, os = /\\(\\)?/g, as = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g, is = /\w*$/, ss = /^[-+]0x[0-9a-f]+$/i, us = /^0b[01]+$/i, ls = /^\[object .+?Constructor\]$/, cs = /^0o[0-7]+$/i, fs = /^(?:0|[1-9]\d*)$/, ds = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g, ps = /($^)/, hs = /['\n\r\u2028\u2029\\]/g, e = "\\ud800-\\udfff", t = "\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff", n = "\\u2700-\\u27bf", r = "a-z\\xdf-\\xf6\\xf8-\\xff", o = "A-Z\\xc0-\\xd6\\xd8-\\xde", a = "\\ufe0e\\ufe0f", i = "\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", s = "[" + e + "]", u = "[" + i + "]", l = "[" + t + "]", c = "\\d+", f = "[" + n + "]", d = "[" + r + "]", p = "[^" + e + i + c + n + r + o + "]", h = "\\ud83c[\\udffb-\\udfff]", m = "[^" + e + "]", b = "(?:\\ud83c[\\udde6-\\uddff]){2}", y = "[\\ud800-\\udbff][\\udc00-\\udfff]", v = "[" + o + "]", _ = "(?:" + d + "|" + p + ")", g = "(?:" + v + "|" + p + ")", x = "(?:['’](?:d|ll|m|re|s|t|ve))?", j = "(?:['’](?:D|LL|M|RE|S|T|VE))?", O = "(?:" + l + "|" + h + ")" + "?", w = "[" + a + "]?", E = w + O + ("(?:\\u200d(?:" + [ m, b, y ].join("|") + ")" + w + O + ")*"), P = "(?:" + [ f, b, y ].join("|") + ")" + E, k = "(?:" + [ m + l + "?", l, b, y, s ].join("|") + ")", ms = RegExp("['’]", "g"), bs = RegExp(l, "g"), T = RegExp(h + "(?=" + h + ")|" + k + E, "g"), ys = RegExp([ v + "?" + d + "+" + x + "(?=" + [ u, v, "$" ].join("|") + ")", g + "+" + j + "(?=" + [ u, v + _, "$" ].join("|") + ")", v + "?" + _ + "+" + x, v + "+" + j, "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", c, P ].join("|"), "g"), M = RegExp("[\\u200d" + e + t + a + "]"), vs = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/, _s = [ "Array", "Buffer", "DataView", "Date", "Error", "Float32Array", "Float64Array", "Function", "Int8Array", "Int16Array", "Int32Array", "Map", "Math", "Object", "Promise", "RegExp", "Set", "String", "Symbol", "TypeError", "Uint8Array", "Uint8ClampedArray", "Uint16Array", "Uint32Array", "WeakMap", "_", "clearTimeout", "isFinite", "parseInt", "setTimeout" ], gs = -1, xs = {}; xs[ki] = xs[Ti] = xs[Mi] = xs[Ai] = xs[Ci] = xs[Si] = xs[Di] = xs[Ri] = xs[Ii] = !0, xs[li] = xs[ci] = xs[Ei] = xs[fi] = xs[Pi] = xs[di] = xs[pi] = xs[hi] = xs[bi] = xs[yi] = xs[vi] = xs[gi] = xs[xi] = xs[ji] = xs[wi] = !1; var js = {}; @@ -26145,7 +26165,7 @@ var _bundleJs = []byte((((`!function(n) { "\r": "r", "\u2028": "u2028", "\u2029": "u2029" - }, Os = parseFloat, ws = parseInt, C = "object" == typeof L && L && L.Object === Object && L, S = "object" == typeof self && self && self.Object === Object && self, Es = C || S || Function("return this")(), D = "object" == typeof K && K && !K.nodeType && K, R = D && "object" == typeof B && B && !B.nodeType && B, Ps = R && R.exports === D, I = Ps && C.process, F = function() { + }, Os = parseFloat, ws = parseInt, C = "object" == typeof N && N && N.Object === Object && N, S = "object" == typeof self && self && self.Object === Object && self, Es = C || S || Function("return this")(), D = "object" == typeof K && K && !K.nodeType && K, R = D && "object" == typeof B && B && !B.nodeType && B, Ps = R && R.exports === D, I = Ps && C.process, F = function() { try { return I && I.binding && I.binding("util"); } catch (e) {} @@ -26185,14 +26205,14 @@ var _bundleJs = []byte((((`!function(n) { for (var n = -1, r = null == e ? 0 : e.length; ++n < r; ) if (!t(e[n], n, e)) return !1; return !0; } - function Ns(e, t) { + function Ls(e, t) { for (var n = -1, r = null == e ? 0 : e.length, o = 0, a = []; ++n < r; ) { var i = e[n]; t(i, n, e) && (a[o++] = i); } return a; } - function Ls(e, t) { + function Ns(e, t) { return !!(null == e ? 0 : e.length) && -1 < Gs(e, t, 0); } function Bs(e, t, n) { @@ -26255,7 +26275,7 @@ var _bundleJs = []byte((((`!function(n) { return null == e ? ti : e[t]; }; } - function N(t) { + function L(t) { return function(e) { return null == t ? ti : t[e]; }; @@ -26297,7 +26317,7 @@ var _bundleJs = []byte((((`!function(n) { for (var n = e.length; n-- && -1 < Gs(t, e[n], 0); ) ; return n; } - var su = N({ + var su = L({ "À": "A", "Á": "A", "Â": "A", @@ -26488,7 +26508,7 @@ var _bundleJs = []byte((((`!function(n) { "œ": "oe", "ʼn": "'n", "ſ": "s" - }), uu = N({ + }), uu = L({ "&": "&", "<": "<", ">": ">", @@ -26538,7 +26558,7 @@ var _bundleJs = []byte((((`!function(n) { function yu(e) { return cu(e) ? e.match(T) || [] : e.split(""); } - var vu = N({ + var vu = L({ "&": "&", "<": "<", ">": ">", @@ -26551,7 +26571,7 @@ var _bundleJs = []byte((((`!function(n) { var e = Bn(w, "defineProperty"); return e({}, "", {}), e; } catch (e) {} - }(), F = t.clearTimeout !== Es.clearTimeout && t.clearTimeout, W = r && r.now !== Es.Date.now && r.now, N = t.setTimeout !== Es.setTimeout && t.setTimeout, L = a.ceil, B = a.floor, U = w.getOwnPropertySymbols, K = g ? g.isBuffer : ti, q = t.isFinite, z = i.join, V = du(w.keys, w), H = a.max, X = a.min, G = r.now, Y = t.parseInt, J = a.random, Z = i.reverse, Q = Bn(t, "DataView"), $ = Bn(t, "Map"), ee = Bn(t, "Promise"), te = Bn(t, "Set"), ne = Bn(t, "WeakMap"), re = Bn(w, "create"), oe = ne && new ne(), ae = {}, ie = pr(Q), se = pr($), ue = pr(ee), le = pr(te), ce = pr(ne), fe = x ? x.prototype : ti, de = fe ? fe.valueOf : ti, pe = fe ? fe.toString : ti; + }(), F = t.clearTimeout !== Es.clearTimeout && t.clearTimeout, W = r && r.now !== Es.Date.now && r.now, L = t.setTimeout !== Es.setTimeout && t.setTimeout, N = a.ceil, B = a.floor, U = w.getOwnPropertySymbols, K = g ? g.isBuffer : ti, q = t.isFinite, z = i.join, V = du(w.keys, w), H = a.max, X = a.min, G = r.now, Y = t.parseInt, J = a.random, Z = i.reverse, Q = Bn(t, "DataView"), $ = Bn(t, "Map"), ee = Bn(t, "Promise"), te = Bn(t, "Set"), ne = Bn(t, "WeakMap"), re = Bn(w, "create"), oe = ne && new ne(), ae = {}, ie = pr(Q), se = pr($), ue = pr(ee), le = pr(te), ce = pr(ne), fe = x ? x.prototype : ti, de = fe ? fe.valueOf : ti, pe = fe ? fe.toString : ti; function he(e) { if (Co(e) && !go(e) && !(e instanceof ve)) { if (e instanceof ye) return e; @@ -26608,7 +26628,7 @@ var _bundleJs = []byte((((`!function(n) { this.size = t.size; } function we(e, t) { - var n = go(e), r = !n && _o(e), o = !n && !r && wo(e), a = !n && !r && !o && Lo(e), i = n || r || o || a, s = i ? tu(e.length, c) : [], u = s.length; + var n = go(e), r = !n && _o(e), o = !n && !r && wo(e), a = !n && !r && !o && No(e), i = n || r || o || a, s = i ? tu(e.length, c) : [], u = s.length; for (var l in e) !t && !E.call(e, l) || i && ("length" == l || o && ("offset" == l || "parent" == l) || a && ("buffer" == l || "byteLength" == l || "byteOffset" == l) || Xn(l, u)) || s.push(l); return s; } @@ -26740,14 +26760,14 @@ var _bundleJs = []byte((((`!function(n) { } return !0; } - function Ne(e, t, n) { + function Le(e, t, n) { if ("function" != typeof e) throw new M(ni); return or(function() { e.apply(ti, n); }, t); } - function Le(e, t, n, r) { - var o = -1, a = Ls, i = !0, s = e.length, u = [], l = t.length; + function Ne(e, t, n, r) { + var o = -1, a = Ns, i = !0, s = e.length, u = [], l = t.length; if (!s) return u; n && (t = Us(t, nu(n))), r ? (a = Bs, i = !1) : 200 <= t.length && (a = ou, i = !1, t = new je(t)); @@ -26807,14 +26827,14 @@ var _bundleJs = []byte((((`!function(n) { string: new _e() }; }, xe.prototype.delete = function(e) { - var t = Nn(this, e).delete(e); + var t = Ln(this, e).delete(e); return this.size -= t ? 1 : 0, t; }, xe.prototype.get = function(e) { - return Nn(this, e).get(e); + return Ln(this, e).get(e); }, xe.prototype.has = function(e) { - return Nn(this, e).has(e); + return Ln(this, e).has(e); }, xe.prototype.set = function(e, t) { - var n = Nn(this, e), r = n.size; + var n = Ln(this, e), r = n.size; return n.set(e, t), this.size += n.size == r ? 0 : 1, this; }, je.prototype.add = je.prototype.push = function(e) { return this.__data__.set(e, ri), this; @@ -26848,7 +26868,7 @@ var _bundleJs = []byte((((`!function(n) { function qe(e, t, n) { for (var r = -1, o = e.length; ++r < o; ) { var a = e[r], i = t(a); - if (null != i && (s === ti ? i == i && !No(i) : n(i, s))) var s = i, u = a; + if (null != i && (s === ti ? i == i && !Lo(i) : n(i, s))) var s = i, u = a; } return u; } @@ -26874,7 +26894,7 @@ var _bundleJs = []byte((((`!function(n) { return e && Xe(e, t, sa); } function Je(t, e) { - return Ns(e, function(e) { + return Ls(e, function(e) { return ko(t[e]); }); } @@ -26908,7 +26928,7 @@ var _bundleJs = []byte((((`!function(n) { return null != e && t in w(e); } function rt(e, t, n) { - for (var r = n ? Bs : Ls, o = e[0].length, a = e.length, i = a, s = T(a), u = 1 / 0, l = []; i--; ) { + for (var r = n ? Bs : Ns, o = e[0].length, a = e.length, i = a, s = T(a), u = 1 / 0, l = []; i--; ) { var c = e[i]; i && t && (c = Us(c, nu(t))), u = X(c.length, u), s[i] = !n && (t || 120 <= o && 120 <= c.length) ? new je(i && c) : ti; } @@ -26940,7 +26960,7 @@ var _bundleJs = []byte((((`!function(n) { if (!wo(t)) return !1; c = !(i = !0); } - if (d && !c) return a || (a = new Oe()), i || Lo(e) ? An(e, t, n, r, o, a) : function(e, t, n, r, o, a, i) { + if (d && !c) return a || (a = new Oe()), i || No(e) ? An(e, t, n, r, o, a) : function(e, t, n, r, o, a, i) { switch (n) { case Pi: if (e.byteLength != t.byteLength || e.byteOffset != t.byteOffset) return !1; @@ -27066,7 +27086,7 @@ var _bundleJs = []byte((((`!function(n) { }), a; } function ht(t) { - var n = Ln(t); + var n = Nn(t); return 1 == n.length && n[0][2] ? er(n[0][0], n[0][1]) : function(e) { return e === t || st(e, t, n); }; @@ -27084,7 +27104,7 @@ var _bundleJs = []byte((((`!function(n) { if (l) return Te(e, n, l); var c = a ? a(s, u, n + "", e, t, i) : ti, f = c === ti; if (f) { - var d = go(u), p = !d && wo(u), h = !d && !p && Lo(u); + var d = go(u), p = !d && wo(u), h = !d && !p && No(u); c = u, d || p || h ? c = go(s) ? s : Oo(s) ? rn(s) : p ? Zt(u, !(f = !1)) : h ? $t(u, !(f = !1)) : [] : Ro(u) || _o(u) ? _o(c = s) ? c = Xo(s) : (!Ao(s) || r && ko(s)) && (c = Vn(u)) : f = !1; } f && (i.set(u, c), o(c, u, r, a, i), i.delete(u)), Te(e, n, c); @@ -27144,7 +27164,7 @@ var _bundleJs = []byte((((`!function(n) { var o = t[n]; if (n == r || o !== a) { var a = o; - Xn(o) ? C.call(e, o, 1) : Lt(e, o); + Xn(o) ? C.call(e, o, 1) : Nt(e, o); } } return e; @@ -27211,7 +27231,7 @@ var _bundleJs = []byte((((`!function(n) { if ("number" == typeof t && t == t && o <= 2147483647) { for (;r < o; ) { var a = r + o >>> 1, i = e[a]; - null !== i && !No(i) && (n ? i <= t : i < t) ? r = a + 1 : o = a; + null !== i && !Lo(i) && (n ? i <= t : i < t) ? r = a + 1 : o = a; } return o; } @@ -27219,8 +27239,8 @@ var _bundleJs = []byte((((`!function(n) { } function Rt(e, t, n, r) { t = n(t); - for (var o = 0, a = null == e ? 0 : e.length, i = t != t, s = null === t, u = No(t), l = t === ti; o < a; ) { - var c = B((o + a) / 2), f = n(e[c]), d = f !== ti, p = null === f, h = f == f, m = No(f); + for (var o = 0, a = null == e ? 0 : e.length, i = t != t, s = null === t, u = Lo(t), l = t === ti; o < a; ) { + var c = B((o + a) / 2), f = n(e[c]), d = f !== ti, p = null === f, h = f == f, m = Lo(f); if (i) var b = r || h; else b = l ? h && (r || d) : s ? h && d && (r || !p) : u ? h && d && !p && (r || !m) : !p && !m && (r ? f <= t : f < t); b ? o = c + 1 : a = c; } @@ -27237,17 +27257,17 @@ var _bundleJs = []byte((((`!function(n) { return a; } function Ft(e) { - return "number" == typeof e ? e : No(e) ? ii : +e; + return "number" == typeof e ? e : Lo(e) ? ii : +e; } function Wt(e) { if ("string" == typeof e) return e; if (go(e)) return Us(e, Wt) + ""; - if (No(e)) return pe ? pe.call(e) : ""; + if (Lo(e)) return pe ? pe.call(e) : ""; var t = e + ""; return "0" == t && 1 / e == -1 / 0 ? "-0" : t; } - function Nt(e, t, n) { - var r = -1, o = Ls, a = e.length, i = !0, s = [], u = s; + function Lt(e, t, n) { + var r = -1, o = Ns, a = e.length, i = !0, s = [], u = s; if (n) i = !1, o = Bs; else if (200 <= a) { var l = t ? null : wn(e); if (l) return mu(l); @@ -27262,7 +27282,7 @@ var _bundleJs = []byte((((`!function(n) { } return s; } - function Lt(e, t) { + function Nt(e, t) { return null == (e = nr(e, t = Xt(t, e))) || delete e[dr(Er(t))]; } function Bt(e, t, n, r) { @@ -27280,9 +27300,9 @@ var _bundleJs = []byte((((`!function(n) { } function qt(e, t, n) { var r = e.length; - if (r < 2) return r ? Nt(e[0]) : []; - for (var o = -1, a = T(r); ++o < r; ) for (var i = e[o], s = -1; ++s < r; ) s != o && (a[o] = Le(a[o] || i, e[s], t, n)); - return Nt(Ve(a, 1), t, n); + if (r < 2) return r ? Lt(e[0]) : []; + for (var o = -1, a = T(r); ++o < r; ) for (var i = e[o], s = -1; ++s < r; ) s != o && (a[o] = Ne(a[o] || i, e[s], t, n)); + return Lt(Ve(a, 1), t, n); } function zt(e, t, n) { for (var r = -1, o = e.length, a = t.length, i = {}; ++r < o; ) { @@ -27323,7 +27343,7 @@ var _bundleJs = []byte((((`!function(n) { } function en(e, t) { if (e !== t) { - var n = e !== ti, r = null === e, o = e == e, a = No(e), i = t !== ti, s = null === t, u = t == t, l = No(t); + var n = e !== ti, r = null === e, o = e == e, a = Lo(e), i = t !== ti, s = null === t, u = t == t, l = Lo(t); if (!s && !l && !a && t < e || a && i && u && !s && !l || r && i && u || !n && u || !o) return 1; if (!r && !a && !l && e < t || l && n && o && !r && !a || s && n && o || !i && o || !u) return -1; } @@ -27521,14 +27541,14 @@ var _bundleJs = []byte((((`!function(n) { function _n(e, t) { var n = (t = t === ti ? " " : Wt(t)).length; if (n < 2) return n ? Ot(t, e) : t; - var r = Ot(t, L(e / bu(t))); + var r = Ot(t, N(e / bu(t))); return cu(t) ? Yt(yu(r), 0, e).join("") : r.slice(0, e); } function gn(r) { return function(e, t, n) { return n && "number" != typeof n && Gn(e, t, n) && (t = n = ti), e = qo(e), t === ti ? (t = e, e = 0) : t = qo(t), function(e, t, n, r) { - for (var o = -1, a = H(L((t - e) / (n || 1)), 0), i = T(a); a--; ) i[r ? a : ++o] = e, + for (var o = -1, a = H(N((t - e) / (n || 1)), 0), i = T(a); a--; ) i[r ? a : ++o] = e, e += n; return i; }(e, t, n = n === ti ? e < t ? 1 : -1 : qo(n), r); @@ -27557,7 +27577,7 @@ var _bundleJs = []byte((((`!function(n) { } var wn = te && 1 / mu(new te([ , -0 ]))[1] == 1 / 0 ? function(e) { return new te(e); - } : Na; + } : La; function En(i) { return function(e) { var t, n, r, o, a = qn(e); @@ -27654,7 +27674,7 @@ var _bundleJs = []byte((((`!function(n) { } var Rn = oe ? function(e) { return oe.get(e); - } : Na; + } : La; function In(e) { for (var t = e.name + "", n = ae[t], r = E.call(ae, t) ? n.length : 0; r--; ) { var o = n[r], a = o.func; @@ -27669,11 +27689,11 @@ var _bundleJs = []byte((((`!function(n) { var e = he.iteratee || Ra; return e = e === Ra ? lt : e, arguments.length ? e(arguments[0], arguments[1]) : e; } - function Nn(e, t) { + function Ln(e, t) { var n, r, o = e.__data__; return ("string" == (r = typeof (n = t)) || "number" == r || "symbol" == r || "boolean" == r ? "__proto__" !== n : null === n) ? o["string" == typeof t ? "string" : "hash"] : o.map; } - function Ln(e) { + function Nn(e) { for (var t = sa(e), n = t.length; n--; ) { var r = t[n], o = e[r]; t[n] = [ r, o, $n(o) ]; @@ -27685,7 +27705,7 @@ var _bundleJs = []byte((((`!function(n) { return ut(o) ? o : ti; } var Un = U ? function(t) { - return null == t ? [] : (t = w(t), Ns(U(t), function(e) { + return null == t ? [] : (t = w(t), Ls(U(t), function(e) { return A.call(t, e); })); } : Va, Kn = U ? function(e) { @@ -27718,7 +27738,7 @@ var _bundleJs = []byte((((`!function(n) { function Yn(e, t) { if (go(e)) return !1; var n = typeof e; - return !("number" != n && "symbol" != n && "boolean" != n && null != e && !No(e)) || Xi.test(e) || !Hi.test(e) || null != t && e in w(t); + return !("number" != n && "symbol" != n && "boolean" != n && null != e && !Lo(e)) || Xi.test(e) || !Hi.test(e) || null != t && e in w(t); } function Jn(e) { var t = In(e), n = he[t]; @@ -27771,7 +27791,7 @@ var _bundleJs = []byte((((`!function(n) { function nr(e, t) { return t.length < 2 ? e : Ze(e, Ct(t, 0, -1)); } - var rr = sr(Tt), or = N || function(e, t) { + var rr = sr(Tt), or = L || function(e, t) { return Es.setTimeout(e, t); }, ar = sr(Mt); function ir(e, t, n) { @@ -27783,7 +27803,7 @@ var _bundleJs = []byte((((`!function(n) { return t[r] = (1 < n ? "& " : "") + t[r], t = t.join(2 < n ? ", " : " "), e.replace(es, "{\n/* [wrapped with " + t + "] */\n"); }(i, (a = i.match(ts), r = a ? a[1].split(ns) : [], o = n, Is(ui, function(e) { var t = "_." + e[0]; - o & e[1] && !Ls(r, t) && r.push(t); + o & e[1] && !Ns(r, t) && r.push(t); }), r.sort()))); } function sr(n) { @@ -27813,7 +27833,7 @@ var _bundleJs = []byte((((`!function(n) { return 500 === cr.size && cr.clear(), e; })).cache, lr); function dr(e) { - if ("string" == typeof e || No(e)) return e; + if ("string" == typeof e || Lo(e)) return e; var t = e + ""; return "0" == t && 1 / e == -1 / 0 ? "-0" : t; } @@ -27835,13 +27855,13 @@ var _bundleJs = []byte((((`!function(n) { t; } var mr = wt(function(e, t) { - return Oo(e) ? Le(e, Ve(t, 1, Oo, !0)) : []; + return Oo(e) ? Ne(e, Ve(t, 1, Oo, !0)) : []; }), br = wt(function(e, t) { var n = Er(t); - return Oo(n) && (n = ti), Oo(e) ? Le(e, Ve(t, 1, Oo, !0), Wn(n, 2)) : []; + return Oo(n) && (n = ti), Oo(e) ? Ne(e, Ve(t, 1, Oo, !0), Wn(n, 2)) : []; }), yr = wt(function(e, t) { var n = Er(t); - return Oo(n) && (n = ti), Oo(e) ? Le(e, Ve(t, 1, Oo, !0), ti, n) : []; + return Oo(n) && (n = ti), Oo(e) ? Ne(e, Ve(t, 1, Oo, !0), ti, n) : []; }); function vr(e, t, n) { var r = null == e ? 0 : e.length; @@ -27889,18 +27909,18 @@ var _bundleJs = []byte((((`!function(n) { return null == e ? e : Z.call(e); } var Ar = wt(function(e) { - return Nt(Ve(e, 1, Oo, !0)); + return Lt(Ve(e, 1, Oo, !0)); }), Cr = wt(function(e) { var t = Er(e); - return Oo(t) && (t = ti), Nt(Ve(e, 1, Oo, !0), Wn(t, 2)); + return Oo(t) && (t = ti), Lt(Ve(e, 1, Oo, !0), Wn(t, 2)); }), Sr = wt(function(e) { var t = Er(e); - return t = "function" == typeof t ? t : ti, Nt(Ve(e, 1, Oo, !0), ti, t); + return t = "function" == typeof t ? t : ti, Lt(Ve(e, 1, Oo, !0), ti, t); }); function Dr(t) { if (!t || !t.length) return []; var n = 0; - return t = Ns(t, function(e) { + return t = Ls(t, function(e) { if (Oo(e)) return n = H(e.length, n), !0; }), tu(n, function(e) { return Us(t, Qs(e)); @@ -27914,16 +27934,16 @@ var _bundleJs = []byte((((`!function(n) { }); } var Ir = wt(function(e, t) { - return Oo(e) ? Le(e, t) : []; + return Oo(e) ? Ne(e, t) : []; }), Fr = wt(function(e) { - return qt(Ns(e, Oo)); + return qt(Ls(e, Oo)); }), Wr = wt(function(e) { var t = Er(e); - return Oo(t) && (t = ti), qt(Ns(e, Oo), Wn(t, 2)); - }), Nr = wt(function(e) { + return Oo(t) && (t = ti), qt(Ls(e, Oo), Wn(t, 2)); + }), Lr = wt(function(e) { var t = Er(e); - return t = "function" == typeof t ? t : ti, qt(Ns(e, Oo), ti, t); - }), Lr = wt(Dr); + return t = "function" == typeof t ? t : ti, qt(Ls(e, Oo), ti, t); + }), Nr = wt(Dr); var Br = wt(function(e) { var t = e.length, n = 1 < t ? e[t - 1] : ti; return Rr(e, n = "function" == typeof n ? (e.pop(), n) : ti); @@ -28044,9 +28064,9 @@ var _bundleJs = []byte((((`!function(n) { }, n; } var so = wt(function(e, t) { - return Ne(e, 1, t); + return Le(e, 1, t); }), uo = wt(function(e, t, n) { - return Ne(e, Ho(t) || 0, n); + return Le(e, Ho(t) || 0, n); }); function lo(o, a) { if ("function" != typeof o || null != a && "function" != typeof a) throw new M(ni); @@ -28160,10 +28180,10 @@ var _bundleJs = []byte((((`!function(n) { function Wo(e) { return "string" == typeof e || !go(e) && Co(e) && $e(e) == ji; } - function No(e) { + function Lo(e) { return "symbol" == typeof e || Co(e) && $e(e) == Oi; } - var Lo = Ss ? nu(Ss) : function(e) { + var No = Ss ? nu(Ss) : function(e) { return Co(e) && Mo(e.length) && !!xs[$e(e)]; }; var Bo = xn(dt), Uo = xn(function(e, t) { @@ -28191,7 +28211,7 @@ var _bundleJs = []byte((((`!function(n) { } function Ho(e) { if ("number" == typeof e) return e; - if (No(e)) return ii; + if (Lo(e)) return ii; if (Ao(e)) { var t = "function" == typeof e.valueOf ? e.valueOf() : e; e = Ao(t) ? t + "" : t; @@ -28256,7 +28276,7 @@ var _bundleJs = []byte((((`!function(n) { e = Us(e, function(e) { return e = Xt(e, t), r || (r = 1 < e.length), e; }), on(t, Dn(t), n), r && (n = Fe(n, 7, Mn)); - for (var o = e.length; o--; ) Lt(n, e[o]); + for (var o = e.length; o--; ) Nt(n, e[o]); return n; }); var da = Cn(function(e, t) { @@ -28357,8 +28377,8 @@ var _bundleJs = []byte((((`!function(n) { }); }), r; } - function Na() {} - var La = vn(Us), Ba = vn(Ws), Ua = vn(Vs); + function La() {} + var Na = vn(Us), Ba = vn(Ws), Ua = vn(Vs); function Ka(e) { return Yn(e) ? Qs(dr(e)) : (t = e, function(e) { return Ze(e, t); @@ -28396,7 +28416,7 @@ var _bundleJs = []byte((((`!function(n) { t = (n ? Gn(e, t, n) : t === ti) ? 1 : H(zo(t), 0); var r = null == e ? 0 : e.length; if (!r || t < 1) return []; - for (var o = 0, a = 0, i = T(L(r / t)); o < r; ) i[a++] = Ct(e, o, o += t); + for (var o = 0, a = 0, i = T(N(r / t)); o < r; ) i[a++] = Ct(e, o, o += t); return i; }, he.compact = function(e) { for (var t = -1, n = null == e ? 0 : e.length, r = 0, o = []; ++t < n; ) { @@ -28454,7 +28474,7 @@ var _bundleJs = []byte((((`!function(n) { return e; }(e, t, n, r)) : []; }, he.filter = function(e, t) { - return (go(e) ? Ns : ze)(e, Wn(t, 3)); + return (go(e) ? Ls : ze)(e, Wn(t, 3)); }, he.flatMap = function(e, t) { return Ve(Qr(e, t), 1); }, he.flatMapDeep = function(e, t) { @@ -28507,7 +28527,7 @@ var _bundleJs = []byte((((`!function(n) { }, he.orderBy = function(e, t, n, r) { return null == e ? [] : (go(t) || (t = null == t ? [] : [ t ]), go(n = r ? ti : n) || (n = null == n ? [] : [ n ]), vt(e, t, n)); - }, he.over = La, he.overArgs = fo, he.overEvery = Ba, he.overSome = Ua, he.partial = po, + }, he.over = Na, he.overArgs = fo, he.overEvery = Ba, he.overSome = Ua, he.partial = po, he.partialRight = ho, he.partition = $r, he.pick = da, he.pickBy = pa, he.property = Ka, he.propertyOf = function(t) { return function(e) { @@ -28518,7 +28538,7 @@ var _bundleJs = []byte((((`!function(n) { }, he.pullAllWith = function(e, t, n) { return e && e.length && t && t.length ? gt(e, t, ti, n) : e; }, he.pullAt = Tr, he.range = qa, he.rangeRight = za, he.rearg = mo, he.reject = function(e, t) { - return (go(e) ? Ns : ze)(e, co(Wn(t, 3))); + return (go(e) ? Ls : ze)(e, co(Wn(t, 3))); }, he.remove = function(e, t) { var n = []; if (!e || !e.length) return n; @@ -28579,9 +28599,9 @@ var _bundleJs = []byte((((`!function(n) { trailing: o }); }, he.thru = Kr, he.toArray = Ko, he.toPairs = ha, he.toPairsIn = ma, he.toPath = function(e) { - return go(e) ? Us(e, dr) : No(e) ? [ e ] : rn(fr(Go(e))); + return go(e) ? Us(e, dr) : Lo(e) ? [ e ] : rn(fr(Go(e))); }, he.toPlainObject = Xo, he.transform = function(e, r, o) { - var t = go(e), n = t || wo(e) || Lo(e); + var t = go(e), n = t || wo(e) || No(e); if (r = Wn(r, 4), null == o) { var a = e && e.constructor; o = n ? t ? new a() : [] : Ao(e) && ko(a) ? me(P(e)) : {}; @@ -28592,13 +28612,13 @@ var _bundleJs = []byte((((`!function(n) { }, he.unary = function(e) { return no(e, 1); }, he.union = Ar, he.unionBy = Cr, he.unionWith = Sr, he.uniq = function(e) { - return e && e.length ? Nt(e) : []; + return e && e.length ? Lt(e) : []; }, he.uniqBy = function(e, t) { - return e && e.length ? Nt(e, Wn(t, 2)) : []; + return e && e.length ? Lt(e, Wn(t, 2)) : []; }, he.uniqWith = function(e, t) { - return t = "function" == typeof t ? t : ti, e && e.length ? Nt(e, ti, t) : []; + return t = "function" == typeof t ? t : ti, e && e.length ? Lt(e, ti, t) : []; }, he.unset = function(e, t) { - return null == e || Lt(e, t); + return null == e || Nt(e, t); }, he.unzip = Dr, he.unzipWith = Rr, he.update = function(e, t, n) { return null == e ? e : Bt(e, t, Ht(n)); }, he.updateWith = function(e, t, n, r) { @@ -28607,7 +28627,7 @@ var _bundleJs = []byte((((`!function(n) { return null == e ? [] : ru(e, ua(e)); }, he.without = Ir, he.words = ka, he.wrap = function(e, t) { return po(Ht(t), e); - }, he.xor = Fr, he.xorBy = Wr, he.xorWith = Nr, he.zip = Lr, he.zipObject = function(e, t) { + }, he.xor = Fr, he.xorBy = Wr, he.xorWith = Lr, he.zip = Nr, he.zipObject = function(e, t) { return zt(e || [], t || [], Me); }, he.zipObjectDeep = function(e, t) { return zt(e || [], t || [], kt); @@ -28672,7 +28692,7 @@ var _bundleJs = []byte((((`!function(n) { return Co(e) && 1 === e.nodeType && !Ro(e); }, he.isEmpty = function(e) { if (null == e) return !0; - if (jo(e) && (go(e) || "string" == typeof e || "function" == typeof e.splice || wo(e) || Lo(e) || _o(e))) return !e.length; + if (jo(e) && (go(e) || "string" == typeof e || "function" == typeof e.splice || wo(e) || No(e) || _o(e))) return !e.length; var t = qn(e); if (t == bi || t == xi) return !e.size; if (Qn(e)) return !ct(e).length; @@ -28686,9 +28706,9 @@ var _bundleJs = []byte((((`!function(n) { }, he.isError = Po, he.isFinite = function(e) { return "number" == typeof e && q(e); }, he.isFunction = ko, he.isInteger = To, he.isLength = Mo, he.isMap = So, he.isMatch = function(e, t) { - return e === t || st(e, t, Ln(t)); + return e === t || st(e, t, Nn(t)); }, he.isMatchWith = function(e, t, n) { - return n = "function" == typeof n ? n : ti, st(e, t, Ln(t), n); + return n = "function" == typeof n ? n : ti, st(e, t, Nn(t), n); }, he.isNaN = function(e) { return Do(e) && e != +e; }, he.isNative = function(e) { @@ -28701,7 +28721,7 @@ var _bundleJs = []byte((((`!function(n) { }, he.isNumber = Do, he.isObject = Ao, he.isObjectLike = Co, he.isPlainObject = Ro, he.isRegExp = Io, he.isSafeInteger = function(e) { return To(e) && -ai <= e && e <= ai; - }, he.isSet = Fo, he.isString = Wo, he.isSymbol = No, he.isTypedArray = Lo, he.isUndefined = function(e) { + }, he.isSet = Fo, he.isString = Wo, he.isSymbol = Lo, he.isTypedArray = No, he.isUndefined = function(e) { return e === ti; }, he.isWeakMap = function(e) { return Co(e) && qn(e) == wi; @@ -28739,12 +28759,12 @@ var _bundleJs = []byte((((`!function(n) { return e && e.length ? yt(e, zo(t)) : ti; }, he.noConflict = function() { return Es._ === this && (Es._ = v), this; - }, he.noop = Na, he.now = to, he.pad = function(e, t, n) { + }, he.noop = La, he.now = to, he.pad = function(e, t, n) { e = Go(e); var r = (t = zo(t)) ? bu(e) : 0; if (!t || t <= r) return e; var o = (t - r) / 2; - return _n(B(o), n) + e + _n(L(o), n); + return _n(B(o), n) + e + _n(N(o), n); }, he.padEnd = function(e, t, n) { e = Go(e); var r = (t = zo(t)) ? bu(e) : 0; @@ -28832,7 +28852,7 @@ var _bundleJs = []byte((((`!function(n) { l = a + e.length, e; }), f += "';\n"; var h = e.variable; - h || (f = "with (obj) {\n" + f + "\n}\n"), f = (u ? f.replace(Fi, "") : f).replace(Wi, "$1").replace(Ni, "$1;"), + h || (f = "with (obj) {\n" + f + "\n}\n"), f = (u ? f.replace(Fi, "") : f).replace(Wi, "$1").replace(Li, "$1;"), f = "function(" + (h || "obj") + ") {\n" + (h ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (s ? ", __e = _.escape" : "") + (u ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + f + "return __p\n}"; var m = Ta(function() { return b(o, p + "return " + f).apply(ti, a); @@ -28894,7 +28914,7 @@ var _bundleJs = []byte((((`!function(n) { } return u + r; }, he.unescape = function(e) { - return (e = Go(e)) && Ui.test(e) ? e.replace(Li, vu) : e; + return (e = Go(e)) && Ui.test(e) ? e.replace(Ni, vu) : e; }, he.uniqueId = function(e) { var t = ++d; return Go(e) + t; @@ -29798,17 +29818,17 @@ var _bundleJs = []byte((((`!function(n) { "use strict"; e.exports = function() {}; }, - "./node_modules/webpack/buildin/global.js": function(CWe, DWe) { - var EWe; - EWe = function() { + "./node_modules/webpack/buildin/global.js": function(JWe, KWe) { + var LWe; + LWe = function() { return this; }(); try { - EWe = EWe || Function("return this")() || eval("this"); + LWe = LWe || Function("return this")() || eval("this"); } catch (e) { - "object" == typeof window && (EWe = window); + "object" == typeof window && (LWe = window); } - CWe.exports = EWe; + JWe.exports = LWe; }, "./node_modules/webpack/buildin/harmony-module.js": function(e, t) { e.exports = function(e) { @@ -29861,7 +29881,7 @@ func bundleJs() (*asset, error) { } info := bindataFileInfo{name: "bundle.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xff, 0x2c, 0xeb, 0xb5, 0xd8, 0xdf, 0xf9, 0x22, 0x6f, 0xfb, 0xdf, 0xbc, 0xca, 0xaf, 0x6b, 0xf6, 0xd, 0x8b, 0xdb, 0xde, 0x8f, 0x40, 0xc, 0xa1, 0xd5, 0x95, 0xcf, 0xe2, 0x44, 0x3, 0x3b, 0xab}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xc2, 0xfe, 0x73, 0x8b, 0xbb, 0xda, 0x42, 0x4f, 0xe5, 0x90, 0x57, 0xdd, 0x12, 0x2e, 0xf3, 0xe4, 0x5f, 0xf9, 0x9f, 0x2b, 0x44, 0xa4, 0xa5, 0xaa, 0xd7, 0x79, 0xe1, 0xa9, 0xf0, 0x1, 0xcc}} return a, nil } diff --git a/dashboard/assets/components/Network.jsx b/dashboard/assets/components/Network.jsx index d07e88b652..470ef0ab41 100644 --- a/dashboard/assets/components/Network.jsx +++ b/dashboard/assets/components/Network.jsx @@ -36,20 +36,45 @@ export const inserter = (sampleLimit: number) => (update: NetworkType, prev: Net } if (Array.isArray(update.diff)) { update.diff.forEach((event: PeerEvent) => { - if (event.removeIP) { - if (event.removeID && prev.peers.bundles[event.removeIP]) { - delete prev.peers.bundles[event.removeIP].knownPeers[event.removeID]; - } - delete prev.peers.bundles[event.removeIP]; - return; - } if (!event.ip) { console.error('Peer event without IP', event); return; } + switch (event.remove) { + case 'bundle': + delete prev.peers.bundles[event.ip]; + return; + case 'known': { + if (!event.id) { + console.error('Remove known peer event without ID', event.ip); + return; + } + const bundle = prev.peers.bundles[event.ip]; + if (!bundle || !bundle.knownPeers || !bundle.knownPeers[event.id]) { + console.error('No known peer to remove', event.ip, event.id); + return; + } + delete bundle.knownPeers[event.id]; + return; + } + case 'unknown': { + const bundle = prev.peers.bundles[event.ip]; + if (!bundle || !Array.isArray(bundle.unknownPeers) || bundle.unknownPeers.length < 1) { + console.error('No unknown peer to remove', event.ip); + return; + } + bundle.unknownPeers.splice(0, 1); + return; + } + } if (!prev.peers.bundles[event.ip]) { prev.peers.bundles[event.ip] = { - location: {}, + location: { + country: '', + city: '', + latitude: 0, + longitude: 0, + }, knownPeers: {}, unknownPeers: [], }; @@ -57,6 +82,7 @@ export const inserter = (sampleLimit: number) => (update: NetworkType, prev: Net const bundle = prev.peers.bundles[event.ip]; if (event.location) { bundle.location = event.location; + return; } if (!event.id) { bundle.unknownPeers.push({ @@ -85,16 +111,6 @@ export const inserter = (sampleLimit: number) => (update: NetworkType, prev: Net console.error('Different traffic sample length', event); return; } - if (peer.ingress.length > 0) { - if (peer.ingress[peer.ingress.length - 1].value < event.ingress[0].value) { - event.ingress[0].value -= peer.ingress[peer.ingress.length - 1].value; - event.egress[0].value -= peer.egress[peer.egress.length - 1].value; - } - } - for (let i = 1; i < event.ingress.length; i++) { - event.ingress[i].value -= event.ingress[i - 1].value; - event.egress[i].value -= event.egress[i - 1].value; - } peer.ingress.splice(peer.ingress.length, 0, ...event.ingress); peer.egress.splice(peer.egress.length, 0, ...event.egress); if (peer.ingress.length > sampleLimit) { @@ -103,7 +119,6 @@ export const inserter = (sampleLimit: number) => (update: NetworkType, prev: Net if (peer.egress.length > sampleLimit) { peer.egress.splice(0, peer.egress.length - sampleLimit); } - // console.log(event.ingress, prev.peers.bundles[event.ip].knownPeers[event.id].ingress); } }); } @@ -138,69 +153,105 @@ class Network extends Component { render() { return ( - - - - IP - Location - Unknown - Node ID - Traffic - Connected - Disconnected - - - - {Object.entries(this.props.content.peers.bundles).map(([ip, bundle]) => ( - - {ip} - - {bundle.location ? (() => { - const l = bundle.location; - return `${l.country ? l.country : ''}${l.city ? `/${l.city}` : ''} ${l.latitude} ${l.longitude}`; - })() : ''} - - - {bundle.unknownPeers && Object.values(bundle.unknownPeers).map(peer => peer.connected && peer.disconnected && `${this.formatTime(peer.connected)}~${this.formatTime(peer.disconnected)}`).join(', ')} - - - {bundle.knownPeers && Object.keys(bundle.knownPeers).map(id => id.substring(0, 10)).join(' ')} - - - {bundle.knownPeers && Object.values(bundle.knownPeers).map(({ingress, egress}) => ( -
- ({ingress: value || 0}))} - margin={{top: 5, right: 5, bottom: 0, left: 5}} - > - } /> - - - ({egress: -value || 0}))} - margin={{top: 0, right: 5, bottom: 5, left: 5}} - > - } /> - - -
- ))} -
- - {bundle.knownPeers && Object.values(bundle.knownPeers).map(peer => peer.connected && peer.connected.map(time => this.formatTime(time)).join(' ')).join(', ')} - - - {bundle.knownPeers && Object.values(bundle.knownPeers).map(peer => peer.disconnected && peer.disconnected.map(time => this.formatTime(time)).join(' ')).join(', ')} - +
+
+ + + IP + Location + Node ID + Traffic + Connected + Disconnected - ))} - -
- ); + + + {Object.entries(this.props.content.peers.bundles).map(([ip, bundle]) => { + if (!bundle.knownPeers || Object.keys(bundle.knownPeers).length < 1) { + return null; + } + return ( + + {ip} + + {bundle.location ? (() => { + const l = bundle.location; + return `${l.country ? l.country : ''}${l.city ? `/${l.city}` : ''} ${l.latitude} ${l.longitude}`; + })() : ''} + + + {Object.keys(bundle.knownPeers).map(id => id.substring(0, 10)).join(' ')} + + + {Object.values(bundle.knownPeers).map(({ingress, egress}) => ( +
+ ({egress: value || 0}))} + margin={{top: 5, right: 5, bottom: 0, left: 5}} + > + } /> + + + ({ingress: -value || 0}))} + margin={{top: 0, right: 5, bottom: 5, left: 5}} + > + } /> + + +
+ ))} +
+ + {Object.values(bundle.knownPeers).map(peer => peer.connected && peer.connected.map(time => this.formatTime(time)).join(' ')).join(', ')} + + + {Object.values(bundle.knownPeers).map(peer => peer.disconnected && peer.disconnected.map(time => this.formatTime(time)).join(' ')).join(', ')} + +
+ ); + })} +
+ + + + + IP + Location + Connected + Disconnected + + + + {Object.entries(this.props.content.peers.bundles).map(([ip, bundle]) => { + if (!bundle.unknownPeers || bundle.unknownPeers.length < 1) { + return null; + } + return ( + + {ip} + + {bundle.location ? (() => { + const l = bundle.location; + return `${l.country ? l.country : ''}${l.city ? `/${l.city}` : ''} ${l.latitude} ${l.longitude}`; + })() : ''} + + + {Object.values(bundle.unknownPeers).map(peer => peer.connected && `${this.formatTime(peer.connected)}`).join(', ')} + + + {Object.values(bundle.unknownPeers).map(peer => peer.disconnected && `${this.formatTime(peer.disconnected)}`).join(', ')} + + + ); + })} + +
+ ); } } diff --git a/dashboard/assets/types/content.jsx b/dashboard/assets/types/content.jsx index 73960eb22f..feb0d9f205 100644 --- a/dashboard/assets/types/content.jsx +++ b/dashboard/assets/types/content.jsx @@ -58,8 +58,7 @@ export type Network = { export type PeerEvent = { ip: string, id: string, - removeIP: string, - removeID: string, + remove: string, location: GeoLocation, connected: Date, disconnected: Date, diff --git a/dashboard/peers.go b/dashboard/peers.go index 48cecb3309..bcfd1f9f55 100644 --- a/dashboard/peers.go +++ b/dashboard/peers.go @@ -28,9 +28,9 @@ import ( ) const ( - eventBufferLimit = 128 // Maximum number of events of buffered peer events. - knownPeerLimit = p2p.MeteredPeerLimit // Maximum number of stored peers, which successfully made the handshake. - unknownPeerLimit = p2p.MeteredPeerLimit // Maximum number of stored peers, which failed to make the handshake. + eventBufferLimit = 128 // Maximum number of events of buffered peer events. + knownPeerLimit = 30 //p2p.MeteredPeerLimit // Maximum number of stored peers, which successfully made the handshake. + unknownPeerLimit = 100 //p2p.MeteredPeerLimit // Maximum number of stored peers, which failed to make the handshake. // eventLimit is the maximum number of the dashboard's custom peer events, // that are collected between two metering period and sent to the clients @@ -136,27 +136,16 @@ func (pc *PeerContainer) getOrInitBundle(ip string) (*PeerBundle, []*PeerEvent) return pc.Bundles[ip], events } +func (pc *PeerContainer) getOrInitKnownPeer(ip, id string) (*KnownPeer, []*PeerEvent) { + bundle, events := pc.getOrInitBundle(ip) + peer, peerEvents := bundle.getOrInitKnownPeer(ip, id, pc.refresh) + return peer, append(events, peerEvents...) +} + // extendKnown handles the events of the successfully connected peers. // Returns the events occurring during the extension. -func (pc *PeerContainer) extendKnown(event *PeerEvent) (events []*PeerEvent) { - bundle, bundleInitEvents := pc.getOrInitBundle(event.IP) - events = append(events, bundleInitEvents...) - peer, peerInitEvents := bundle.getOrInitKnownPeer(event.IP, event.ID, pc.refresh) - events = append(events, peerInitEvents...) - if peer.listElement != nil { - // If the peer is already in the list, remove it and reinsert later. - pc.knownPeers.Remove(peer.listElement) - peer.listElement = nil - } - for pc.knownPeers.Len() >= knownPeerLimit { - // While the length of the list is greater than or equal to the limit before - // the insertion, remove the first element from the list and from the map. - if removedPeer, ok := pc.knownPeers.Remove(pc.knownPeers.Front()).(*KnownPeer); ok { - if event := pc.removeKnown(removedPeer.ip, removedPeer.id); event != nil { - events = append(events, event) - } - } - } +func (pc *PeerContainer) extendKnown(event *PeerEvent) []*PeerEvent { + peer, events := pc.getOrInitKnownPeer(event.IP, event.ID) // Append the connect and the disconnect events to // the corresponding arrays keeping the limit. if event.Connected != nil { @@ -171,24 +160,44 @@ func (pc *PeerContainer) extendKnown(event *PeerEvent) (events []*PeerEvent) { peer.Disconnected = peer.Disconnected[first:] } } + if peer.listElement != nil { + if pc.activeSeparator == peer.listElement { + pc.activeSeparator = pc.activeSeparator.Prev() + } + // If the peer is already in the list, remove and reinsert it. + _ = pc.knownPeers.Remove(peer.listElement) + peer.listElement = nil + } // Insert the peer into the list. if pc.activeSeparator == nil { // If there isn't active peer in the list peer.listElement = pc.knownPeers.PushBack(peer) pc.activeSeparator = peer.listElement + } else if e := pc.knownPeers.InsertAfter(peer, pc.activeSeparator); e != nil { + // Insert the peer after the last inactive peer, and set it as the separator. + peer.listElement, pc.activeSeparator = e, e } else { - // Insert the peer after the last inactive peer, then increment the separator. - peer.listElement = pc.knownPeers.InsertAfter(peer, pc.activeSeparator) - pc.activeSeparator = pc.activeSeparator.Next() + log.Warn("Failed to insert known peer", "peer", *peer) + } + for pc.knownPeers.Len() > knownPeerLimit { + // While the length of the list is greater than the limit, + // remove the first element from the list and from the map. + if pc.activeSeparator == pc.knownPeers.Front() { + pc.activeSeparator = nil + } + if removedPeer, ok := pc.knownPeers.Remove(pc.knownPeers.Front()).(*KnownPeer); ok { + events = append(events, pc.removeKnown(removedPeer.ip, removedPeer.id)...) + } else { + log.Warn("Failed to parse the removed peer") + } } return events } // extendUnknown handles the events of the peers failing before/during the handshake. // Returns the events occurring during the extension. -func (pc *PeerContainer) extendUnknown(event *PeerEvent) (events []*PeerEvent) { - bundle, initEvents := pc.getOrInitBundle(event.IP) - events = append(events, initEvents...) +func (pc *PeerContainer) extendUnknown(event *PeerEvent) []*PeerEvent { + bundle, events := pc.getOrInitBundle(event.IP) bundle.UnknownPeers = append(bundle.UnknownPeers, &UnknownPeer{ Connected: *event.Connected, Disconnected: *event.Disconnected, @@ -198,16 +207,14 @@ func (pc *PeerContainer) extendUnknown(event *PeerEvent) (events []*PeerEvent) { // While the length of the connection attempt order array is greater // than the limit, remove the first element from the involved peer's // array and also from the super array. - if r := pc.removeUnknown(pc.unknownPeers[0]); r != nil { - events = append(events, r) - } + events = append(events, pc.removeUnknown(pc.unknownPeers[0])...) pc.unknownPeers = pc.unknownPeers[1:] } return events } // setActive moves the peer denoted by the given IP address and node ID after -// the list's active separator. +// the list's active separator. Takes no effect if the peer doesn't exist. func (pc *PeerContainer) setActive(ip, id string) { if bundle, ok := pc.Bundles[ip]; ok { if peer, ok := bundle.KnownPeers[id]; ok { @@ -215,14 +222,19 @@ func (pc *PeerContainer) setActive(ip, id string) { // If the peer is already in the list, remove it first. // Theoretically this should always happen, because all // the peers are inserted into the list. - pc.knownPeers.Remove(peer.listElement) + if pc.activeSeparator == peer.listElement { + pc.activeSeparator = pc.activeSeparator.Prev() + } + _ = pc.knownPeers.Remove(peer.listElement) } if pc.activeSeparator == nil { // If there isn't active peer yet. peer.listElement = pc.knownPeers.PushBack(peer) pc.activeSeparator = peer.listElement + } else if e := pc.knownPeers.InsertAfter(peer, pc.activeSeparator); e != nil { + peer.listElement = e } else { - peer.listElement = pc.knownPeers.InsertAfter(peer, pc.activeSeparator) + log.Warn("Failed to insert the peer after the separator", "peer", peer) } } } @@ -250,41 +262,53 @@ type PeerBundle struct { // removeKnown removes the known peer belonging to the // given IP address and node ID from the peer tree. -func (pc *PeerContainer) removeKnown(ip, id string) (removed *PeerEvent) { +func (pc *PeerContainer) removeKnown(ip, id string) (events []*PeerEvent) { if bundle, ok := pc.Bundles[ip]; ok { if _, ok := bundle.KnownPeers[id]; ok { - removed = &PeerEvent{ - RemoveID: id, - } + events = append(events, &PeerEvent{ + Remove: RemoveKnown, + IP: ip, + ID: id, + }) delete(bundle.KnownPeers, id) + } else { + log.Warn("No peer to remove", ip, id) } if len(bundle.KnownPeers) < 1 && len(bundle.UnknownPeers) < 1 { - if removed == nil { - removed = &PeerEvent{ - RemoveIP: ip, - } - } else { - removed.RemoveIP = ip - } + events = append(events, &PeerEvent{ + Remove: RemoveBundle, + IP: ip, + }) delete(pc.Bundles, ip) } + } else { + log.Warn("No bundle to remove", ip) } - return removed + return events } // removeUnknown removes the unknown peer belonging to the // given IP address and node ID from the peer tree. -func (pc *PeerContainer) removeUnknown(ip string) (removed *PeerEvent) { +func (pc *PeerContainer) removeUnknown(ip string) (events []*PeerEvent) { if bundle, ok := pc.Bundles[ip]; ok { if len(bundle.UnknownPeers) > 0 { + events = append(events, &PeerEvent{ + Remove: RemoveUnknown, + IP: ip, + }) bundle.UnknownPeers = bundle.UnknownPeers[1:] } - if len(bundle.KnownPeers) < 1 && len(bundle.UnknownPeers) < 1 { - removed = &PeerEvent{RemoveIP: ip} + if len(bundle.UnknownPeers) < 1 && len(bundle.KnownPeers) < 1 { + events = append(events, &PeerEvent{ + Remove: RemoveBundle, + IP: ip, + }) delete(pc.Bundles, ip) } + } else { + log.Warn("No bundle to remove", ip) } - return removed + return events } // getOrInitKnownPeer inserts a new peer into the map, if the peer belonging @@ -300,8 +324,8 @@ func (bundle *PeerBundle) getOrInitKnownPeer(ip, id string, refresh time.Duratio events = append(events, &PeerEvent{ IP: ip, ID: id, - Ingress: ingress, - Egress: egress, + Ingress: append([]*ChartEntry{}, ingress...), + Egress: append([]*ChartEntry{}, egress...), }) bundle.KnownPeers[id] = &KnownPeer{ ip: ip, @@ -333,6 +357,8 @@ type KnownPeer struct { listElement *list.Element // Pointer to the peer element in the list. ip, id string // The IP and the ID by which the peer can be accessed in the tree. + prevIngress float64 + prevEgress float64 } // UnknownPeer contains a failed peer connection attempt's attributes. @@ -345,17 +371,24 @@ type UnknownPeer struct { Disconnected time.Time `json:"disconnected"` } +type RemovedPeerType string + +const ( + RemoveKnown RemovedPeerType = "known" + RemoveUnknown RemovedPeerType = "unknown" + RemoveBundle RemovedPeerType = "bundle" +) + // PeerEvent contains the attributes of a peer event. type PeerEvent struct { - IP string `json:"ip,omitempty"` // IP address of the peer. - ID string `json:"id,omitempty"` // Node ID of the peer. - RemoveIP string `json:"removeIP,omitempty"` // IP address of the peer that is to be removed. - RemoveID string `json:"removeID,omitempty"` // Node ID of the peer that is to be removed. - Location *GeoLocation `json:"location,omitempty"` // Geographical location of the peer. - Connected *time.Time `json:"connected,omitempty"` // Timestamp of the connection moment. - Disconnected *time.Time `json:"disconnected,omitempty"` // Timestamp of the disonnection moment. - Ingress ChartEntries `json:"ingress,omitempty"` // Ingress samples. - Egress ChartEntries `json:"egress,omitempty"` // Egress samples. + IP string `json:"ip,omitempty"` // IP address of the peer. + ID string `json:"id,omitempty"` // Node ID of the peer. + Remove RemovedPeerType `json:"remove,omitempty"` // Type of the peer that is to be removed. + Location *GeoLocation `json:"location,omitempty"` // Geographical location of the peer. + Connected *time.Time `json:"connected,omitempty"` // Timestamp of the connection moment. + Disconnected *time.Time `json:"disconnected,omitempty"` // Timestamp of the disonnection moment. + Ingress ChartEntries `json:"ingress,omitempty"` // Ingress samples. + Egress ChartEntries `json:"egress,omitempty"` // Egress samples. } // trafficMap @@ -423,9 +456,9 @@ func (db *Dashboard) collectPeerData() { } db.peerLock.Unlock() - // diff contains peer events, which trigger operations that + // newPeerEvents contains peer events, which trigger operations that // will be executed on the peer tree after a metering period. - diff := make([]*PeerEvent, 0, eventLimit) + newPeerEvents := make([]*PeerEvent, 0, eventLimit) ingress, egress := new(trafficMap), new(trafficMap) *ingress, *egress = make(trafficMap), make(trafficMap) @@ -436,15 +469,16 @@ func (db *Dashboard) collectPeerData() { switch event.Type { case p2p.PeerConnected: connected := now.Add(-event.Elapsed) - diff = append(diff, &PeerEvent{ + newPeerEvents = append(newPeerEvents, &PeerEvent{ IP: event.IP.String(), - ID: event.ID, + ID: event.ID.String(), Connected: &connected, }) case p2p.PeerDisconnected: - diff = append(diff, &PeerEvent{ - IP: event.IP.String(), - ID: event.ID, + ip, id := event.IP.String(), event.ID.String() + newPeerEvents = append(newPeerEvents, &PeerEvent{ + IP: ip, + ID: id, Disconnected: &now, }) // The disconnect event comes with the last metered traffic count, @@ -453,11 +487,11 @@ func (db *Dashboard) collectPeerData() { // period the same peer disconnects multiple times, and appending // all the samples to the traffic arrays would shift the metering, // so only the last metering is stored, overwriting the previous one. - ingress.insert(event.IP.String(), event.ID, float64(event.Ingress)) - egress.insert(event.IP.String(), event.ID, float64(event.Egress)) + ingress.insert(ip, id, float64(event.Ingress)) + egress.insert(ip, id, float64(event.Egress)) case p2p.PeerHandshakeFailed: connected := now.Add(-event.Elapsed) - diff = append(diff, &PeerEvent{ + newPeerEvents = append(newPeerEvents, &PeerEvent{ IP: event.IP.String(), Connected: &connected, Disconnected: &now, @@ -470,7 +504,9 @@ func (db *Dashboard) collectPeerData() { p2p.PeerIngressRegistry.Each(collectIngress(ingress)) p2p.PeerEgressRegistry.Each(collectEgress(egress)) + // Protect 'peers', because it is part of the history. db.peerLock.Lock() + // Usually the active peers don't produce events, and marking // them as active makes it sure that they won't be removed from // the tree. Only the active peers are registered into the peer @@ -486,44 +522,58 @@ func (db *Dashboard) collectPeerData() { peers.resetActiveSeparator() for ip, bundle := range *ingress { for id := range bundle { + // Only set the peers that are inserted both + // into the ingress and the egress maps. if _, ok := (*egress)[ip][id]; ok { peers.setActive(ip, id) + } else { + log.Warn("Peer missing traffic sample", "IP", ip, "ID", id) } } } - var events []*PeerEvent - for i := 0; i < len(diff); i++ { - if diff[i].IP == "" { - log.Warn("Peer event without IP", "event", *diff[i]) + var diff []*PeerEvent + for i := 0; i < len(newPeerEvents); i++ { + if newPeerEvents[i].IP == "" { + log.Warn("Peer event without IP", "event", *newPeerEvents[i]) continue } + diff = append(diff, newPeerEvents[i]) // There are two main branches of peer events coming from the event // feed, one belongs to the known peers, one to the unknown peers. // If the event has node ID, it belongs to a known peer, otherwise // to an unknown one. - if diff[i].ID == "" { - events = append(events, peers.extendUnknown(diff[i])...) + // + // The extension can produce additional peer events, such + // as remove, location and initial samples events. + if newPeerEvents[i].ID == "" { + diff = append(diff, peers.extendUnknown(newPeerEvents[i])...) continue } - events = append(events, peers.extendKnown(diff[i])...) + diff = append(diff, peers.extendKnown(newPeerEvents[i])...) } - // The insertion can produce additional peer events, such - // as remove, location and initial samples events. These - // are stored in the 'events', then appended to the 'diff'. - diff = append(diff, events...) + now := time.Now() - // Update the peer tree using the events. + // Update the peer tree using the traffic maps. for ip, bundle := range peers.Bundles { for id, peer := range bundle.KnownPeers { // Value is 0 if the traffic map doesn't have the // entry corresponding to the given IP and ID. + curIngress, curEgress := (*ingress)[ip][id], (*egress)[ip][id] + deltaIngress, deltaEgress := curIngress, curEgress + if deltaIngress >= peer.prevIngress { + deltaIngress -= peer.prevIngress + } + if deltaEgress >= peer.prevEgress { + deltaEgress -= peer.prevEgress + } + peer.prevIngress, peer.prevEgress = curIngress, curEgress i := &ChartEntry{ Time: now, - Value: (*ingress)[ip][id], + Value: deltaIngress, } e := &ChartEntry{ Time: now, - Value: (*egress)[ip][id], + Value: deltaEgress, } peer.Ingress = append(peer.Ingress, i) peer.Egress = append(peer.Egress, e) @@ -542,15 +592,20 @@ func (db *Dashboard) collectPeerData() { }) } } + //ss, _ := json.MarshalIndent(db.history.Network, "", " ") + //fmt.Println(string(ss)) + db.peerLock.Unlock() + //s, _ := json.MarshalIndent(diff, "", " ") + //fmt.Println(string(s)) db.sendToAll(&Message{Network: &NetworkMessage{ - Diff: append([]*PeerEvent{}, diff...)}, - }) + Diff: diff, + }}) // Clear the traffic maps, and the event array, // prepare them for the next metering. *ingress, *egress = make(trafficMap), make(trafficMap) - diff = diff[:0] + newPeerEvents = newPeerEvents[:0] case err := <-subPeer.Err(): log.Warn("Peer subscription error", "err", err) return diff --git a/p2p/metrics.go b/p2p/metrics.go index 6a7c0bad33..d7873f39a5 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -74,7 +74,7 @@ const ( type MeteredPeerEvent struct { Type MeteredPeerEventType // Type of peer event IP net.IP // IP address of the peer - ID string // NodeID of the peer + ID enode.ID // NodeID of the peer Elapsed time.Duration // Time elapsed between the connection and the handshake/disconnection Ingress uint64 // Ingress count at the moment of the event Egress uint64 // Egress count at the moment of the event @@ -93,7 +93,7 @@ type meteredConn struct { connected time.Time // Connection time of the peer ip net.IP // IP address of the peer - id string // NodeID of the peer + id enode.ID // NodeID of the peer // trafficMetered denotes if the peer is registered in the traffic registries. // Its value is true if the metered peer count doesn't reach the limit in the @@ -160,8 +160,7 @@ func (c *meteredConn) Write(b []byte) (n int, err error) { // handshakeDone is called when a peer handshake is done. Registers the peer to // the ingress and the egress traffic registries using the peer's IP and node ID, // also emits connect event. -func (c *meteredConn) handshakeDone(nodeID enode.ID) { - id := nodeID.String() +func (c *meteredConn) handshakeDone(id enode.ID) { if atomic.AddInt32(&meteredPeerCount, 1) >= MeteredPeerLimit { // Don't register the peer in the traffic registries. atomic.AddInt32(&meteredPeerCount, -1) @@ -170,7 +169,7 @@ func (c *meteredConn) handshakeDone(nodeID enode.ID) { c.lock.Unlock() log.Warn("Metered peer count reached the limit") } else { - key := fmt.Sprintf("%s/%s", c.ip, id) + key := fmt.Sprintf("%s/%s", c.ip, id.String()) c.lock.Lock() c.id, c.trafficMetered = id, true c.ingressMeter = metrics.NewRegisteredMeter(key, PeerIngressRegistry) @@ -190,7 +189,7 @@ func (c *meteredConn) handshakeDone(nodeID enode.ID) { func (c *meteredConn) Close() error { err := c.Conn.Close() c.lock.RLock() - if c.id == "" { + if c.id == (enode.ID{}) { // If the peer disconnects before the handshake. c.lock.RUnlock() meteredPeerFeed.Send(MeteredPeerEvent{