KaiOS RAM graph plugin
Summary:
This plugin simply plots a graph of RAM usage per app (with some built-in apps are excluded).
Can be useful for debugging memory spikes.
{F218362880}
Reviewed By: jknoxville
Differential Revision: D18013073
fbshipit-source-id: 93e2f87280a734d1d05f4f5b600f7b81024bd348
This commit is contained in:
committed by
Facebook Github Bot
parent
ac4e1ce71b
commit
0077f4c9f2
270
src/plugins/kaios-ram/index.tsx
Normal file
270
src/plugins/kaios-ram/index.tsx
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*
|
||||||
|
* @format
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import {FlipperDevicePlugin, Device, KaiOSDevice} from 'flipper';
|
||||||
|
|
||||||
|
import {FlexColumn, Button, Toolbar, Panel} from 'flipper';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Legend,
|
||||||
|
LineChart,
|
||||||
|
Line,
|
||||||
|
YAxis,
|
||||||
|
XAxis,
|
||||||
|
CartesianGrid,
|
||||||
|
ResponsiveContainer,
|
||||||
|
Tooltip,
|
||||||
|
} from 'recharts';
|
||||||
|
|
||||||
|
import adb from 'adbkit';
|
||||||
|
|
||||||
|
const PALETTE = [
|
||||||
|
'#FFD700',
|
||||||
|
'#FF6347',
|
||||||
|
'#8A2BE2',
|
||||||
|
'#A52A2A',
|
||||||
|
'#40E0D0',
|
||||||
|
'#006400',
|
||||||
|
'#ADFF2F',
|
||||||
|
'#FF00FF',
|
||||||
|
];
|
||||||
|
|
||||||
|
// For now, let's limit the number of points shown
|
||||||
|
// The graph will automatically drop the oldest point if this number is reached
|
||||||
|
const MAX_POINTS = 100;
|
||||||
|
|
||||||
|
// This is to have some consistency in the Y axis scale
|
||||||
|
// Recharts should automatically adjust the axis if any data point gets above this value
|
||||||
|
const Y_AXIS_EXPECTED_MAX_MEM = 200;
|
||||||
|
|
||||||
|
const EXCLUDE_PROCESS_NAME_SUBSTRINGS = [
|
||||||
|
'(Nuwa)',
|
||||||
|
'Launcher',
|
||||||
|
'Built-in',
|
||||||
|
'Jio',
|
||||||
|
'(Preallocated',
|
||||||
|
];
|
||||||
|
|
||||||
|
type DataPoint = {
|
||||||
|
[key: string]: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Colors = {
|
||||||
|
[key: string]: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type State = {
|
||||||
|
points: Array<DataPoint>;
|
||||||
|
colors: Colors;
|
||||||
|
monitoring: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default class KaiOSGraphs extends FlipperDevicePlugin<State, any, any> {
|
||||||
|
state = {
|
||||||
|
points: [],
|
||||||
|
colors: {},
|
||||||
|
monitoring: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
intervalID: NodeJS.Timer | null = null;
|
||||||
|
|
||||||
|
static supportsDevice(device: Device) {
|
||||||
|
return device instanceof KaiOSDevice;
|
||||||
|
}
|
||||||
|
|
||||||
|
onStartMonitor = () => {
|
||||||
|
if (this.intervalID) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.intervalID = setInterval(this.updateFreeMem, 1000);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
monitoring: true,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
onStopMonitor = () => {
|
||||||
|
if (!this.intervalID) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
clearInterval(this.intervalID);
|
||||||
|
this.intervalID = null;
|
||||||
|
this.setState({
|
||||||
|
monitoring: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
executeShell = (command: string) => {
|
||||||
|
return (this.device as KaiOSDevice).adb
|
||||||
|
.shell(this.device.serial, command)
|
||||||
|
.then(adb.util.readAll)
|
||||||
|
.then(output => {
|
||||||
|
return output.toString().trim();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
getMemory = () => {
|
||||||
|
return this.executeShell('b2g-info').then(output => {
|
||||||
|
const lines = output.split('\n').map(line => line.trim());
|
||||||
|
let freeMem = null;
|
||||||
|
for (const line of lines) {
|
||||||
|
// TODO: regex validation
|
||||||
|
if (line.startsWith('Free + cache')) {
|
||||||
|
const fields = line.split(' ');
|
||||||
|
const mem = fields[fields.length - 2];
|
||||||
|
freeMem = parseFloat(mem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const appInfoData: {[key: string]: number} = {};
|
||||||
|
let appInfoSectionFieldsCount;
|
||||||
|
const appInfoSectionFieldToIndex: {[key: string]: number} = {};
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.startsWith('System memory info:')) {
|
||||||
|
// We're outside of the app info section
|
||||||
|
// Reset the counter, since it is used for detecting if we need to parse
|
||||||
|
// app memory usage data
|
||||||
|
appInfoSectionFieldsCount = undefined;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!line) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (appInfoSectionFieldsCount) {
|
||||||
|
let fields = line.trim().split(/\s+/);
|
||||||
|
// Assume that only name field can contain spaces
|
||||||
|
const name = fields
|
||||||
|
.slice(0, -appInfoSectionFieldsCount + 1)
|
||||||
|
.join(' ');
|
||||||
|
const restOfTheFields = fields.slice(-appInfoSectionFieldsCount + 1);
|
||||||
|
fields = [name, ...restOfTheFields];
|
||||||
|
if (
|
||||||
|
EXCLUDE_PROCESS_NAME_SUBSTRINGS.some(excludeSubstr =>
|
||||||
|
name.includes(excludeSubstr),
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (fields[1].match(/[^0-9]+/)) {
|
||||||
|
// TODO: probably implement this through something other than b2g
|
||||||
|
throw new Error('Support for names with spaces is not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name !== 'b2g') {
|
||||||
|
const ussString = fields[appInfoSectionFieldToIndex['USS']];
|
||||||
|
const uss = ussString ? parseFloat(ussString) : -1;
|
||||||
|
appInfoData[name + ' USS'] = uss;
|
||||||
|
} else {
|
||||||
|
const rssString = fields[appInfoSectionFieldToIndex['RSS']];
|
||||||
|
const rss = rssString ? parseFloat(rssString) : -1;
|
||||||
|
appInfoData[name + ' RSS'] = rss;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line.startsWith('NAME')) {
|
||||||
|
// We're in the app info section now
|
||||||
|
const fields = line.trim().split(/\s+/);
|
||||||
|
appInfoSectionFieldsCount = fields.length;
|
||||||
|
for (let i = 0; i < fields.length; i++) {
|
||||||
|
appInfoSectionFieldToIndex[fields[i]] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {'Total free': freeMem != null ? freeMem : -1, ...appInfoData};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
getColors = (point: DataPoint) => {
|
||||||
|
const oldColors = this.state.colors;
|
||||||
|
let newColors: Colors | null = null;
|
||||||
|
let newColorsCount = 0;
|
||||||
|
const existingNames = Object.keys(oldColors);
|
||||||
|
for (const name of Object.keys(point)) {
|
||||||
|
if (!(name in oldColors)) {
|
||||||
|
if (!newColors) {
|
||||||
|
newColors = {...oldColors};
|
||||||
|
}
|
||||||
|
newColors[name] = PALETTE[existingNames.length + newColorsCount];
|
||||||
|
newColorsCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return newColors;
|
||||||
|
};
|
||||||
|
|
||||||
|
updateFreeMem = () => {
|
||||||
|
// This can be improved by using immutable.js
|
||||||
|
// If more points are necessary
|
||||||
|
return this.getMemory().then(point => {
|
||||||
|
const points = [...this.state.points.slice(-MAX_POINTS + 1), point];
|
||||||
|
const colors = this.getColors(point);
|
||||||
|
let newState = {};
|
||||||
|
if (colors) {
|
||||||
|
newState = {colors, points};
|
||||||
|
} else {
|
||||||
|
newState = {points};
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setState(newState);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const pointsToDraw = this.state.points.map((point, idx) => ({
|
||||||
|
...(point as Object),
|
||||||
|
idx,
|
||||||
|
}));
|
||||||
|
const colors: Colors = this.state.colors;
|
||||||
|
|
||||||
|
const names = Object.keys(colors);
|
||||||
|
return (
|
||||||
|
<Panel
|
||||||
|
padded={false}
|
||||||
|
heading="Free memory"
|
||||||
|
floating={false}
|
||||||
|
collapsable={false}
|
||||||
|
grow={true}>
|
||||||
|
<Toolbar position="top">
|
||||||
|
{this.state.monitoring ? (
|
||||||
|
<Button onClick={this.onStopMonitor} icon="pause">
|
||||||
|
Pause
|
||||||
|
</Button>
|
||||||
|
) : (
|
||||||
|
<Button onClick={this.onStartMonitor} icon="play">
|
||||||
|
Start
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Toolbar>
|
||||||
|
<FlexColumn grow={true}>
|
||||||
|
<ResponsiveContainer height={500}>
|
||||||
|
<LineChart data={pointsToDraw}>
|
||||||
|
<XAxis type="number" domain={[0, MAX_POINTS]} dataKey="idx" />
|
||||||
|
<YAxis type="number" domain={[0, Y_AXIS_EXPECTED_MAX_MEM]} />
|
||||||
|
{names.map(name => (
|
||||||
|
<Line
|
||||||
|
key={`line-${name}`}
|
||||||
|
type="linear"
|
||||||
|
dataKey={name}
|
||||||
|
stroke={colors[name]}
|
||||||
|
isAnimationActive={false}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
<Tooltip />
|
||||||
|
<Legend verticalAlign="bottom" height={36} />
|
||||||
|
<CartesianGrid stroke="#eee" strokeDasharray="5 5" />
|
||||||
|
</LineChart>
|
||||||
|
</ResponsiveContainer>
|
||||||
|
</FlexColumn>
|
||||||
|
</Panel>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/plugins/kaios-ram/package.json
Normal file
19
src/plugins/kaios-ram/package.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "kaios-graphs",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.tsx",
|
||||||
|
"license": "MIT",
|
||||||
|
"title": "KaiOS RAM graph",
|
||||||
|
"icon": "apps",
|
||||||
|
"bugs": {
|
||||||
|
"email": "oncall+wa_kaios@xmail.facebook.com",
|
||||||
|
"url": "https://fb.workplace.com/groups/wa.kaios/"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"adbkit": "^2.11.1",
|
||||||
|
"recharts": "1.7.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/recharts": "1.7.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
361
src/plugins/kaios-ram/yarn.lock
Normal file
361
src/plugins/kaios-ram/yarn.lock
Normal file
@@ -0,0 +1,361 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@babel/runtime@^7.1.2":
|
||||||
|
version "7.5.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
||||||
|
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
|
"@types/d3-path@*":
|
||||||
|
version "1.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79"
|
||||||
|
integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==
|
||||||
|
|
||||||
|
"@types/d3-shape@*":
|
||||||
|
version "1.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.2.tgz#a41d9d6b10d02e221696b240caf0b5d0f5a588ec"
|
||||||
|
integrity sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-path" "*"
|
||||||
|
|
||||||
|
"@types/prop-types@*":
|
||||||
|
version "15.7.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
|
||||||
|
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
|
||||||
|
|
||||||
|
"@types/react@*":
|
||||||
|
version "16.9.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.9.tgz#a62c6f40f04bc7681be5e20975503a64fe783c3a"
|
||||||
|
integrity sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg==
|
||||||
|
dependencies:
|
||||||
|
"@types/prop-types" "*"
|
||||||
|
csstype "^2.2.0"
|
||||||
|
|
||||||
|
"@types/recharts-scale@*":
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/recharts-scale/-/recharts-scale-1.0.0.tgz#348c9220d6d9062c44a9d585d686644a97f7e25d"
|
||||||
|
integrity sha512-HR/PrCcxYb2YHviTqH7CMdL1TUhUZLTUKzfrkMhxm1HTa5mg/QtP8XMiuSPz6dZ6wecazAOu8aYZ5DqkNlgHHQ==
|
||||||
|
|
||||||
|
"@types/recharts@1.7.1":
|
||||||
|
version "1.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/recharts/-/recharts-1.7.1.tgz#582258e023dc1f659e8e59dda2ce51543d4b5775"
|
||||||
|
integrity sha512-Ggb0TI/SCODmRR0CBMObqYrLJmdfxL23pm6AxU61bP0NcsUvnbmYUYT1VMr+BcjFjPxX+DTaSP2NXTJs3ZSAiw==
|
||||||
|
dependencies:
|
||||||
|
"@types/d3-shape" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@types/recharts-scale" "*"
|
||||||
|
|
||||||
|
adbkit-logcat@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/adbkit-logcat/-/adbkit-logcat-1.1.0.tgz#01d7f9b0cef9093a30bcb3b007efff301508962f"
|
||||||
|
integrity sha1-Adf5sM75CTowvLOwB+//MBUIli8=
|
||||||
|
|
||||||
|
adbkit-monkey@~1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/adbkit-monkey/-/adbkit-monkey-1.0.1.tgz#f291be701a2efc567a63fc7aa6afcded31430be1"
|
||||||
|
integrity sha1-8pG+cBou/FZ6Y/x6pq/N7TFDC+E=
|
||||||
|
dependencies:
|
||||||
|
async "~0.2.9"
|
||||||
|
|
||||||
|
adbkit@^2.11.1:
|
||||||
|
version "2.11.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/adbkit/-/adbkit-2.11.1.tgz#7da847fe561254f3121088947bc1907ef053e894"
|
||||||
|
integrity sha512-hDTiRg9NX3HQt7WoDAPCplUpvzr4ZzQa2lq7BdTTJ/iOZ6O7YNAs6UYD8sFAiBEcYHDRIyq3cm9sZP6uZnhvXw==
|
||||||
|
dependencies:
|
||||||
|
adbkit-logcat "^1.1.0"
|
||||||
|
adbkit-monkey "~1.0.1"
|
||||||
|
bluebird "~2.9.24"
|
||||||
|
commander "^2.3.0"
|
||||||
|
debug "~2.6.3"
|
||||||
|
node-forge "^0.7.1"
|
||||||
|
split "~0.3.3"
|
||||||
|
|
||||||
|
async@~0.2.9:
|
||||||
|
version "0.2.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
|
||||||
|
integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
|
||||||
|
|
||||||
|
balanced-match@^0.4.2:
|
||||||
|
version "0.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
|
||||||
|
integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=
|
||||||
|
|
||||||
|
bluebird@~2.9.24:
|
||||||
|
version "2.9.34"
|
||||||
|
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.9.34.tgz#2f7b4ec80216328a9fddebdf69c8d4942feff7d8"
|
||||||
|
integrity sha1-L3tOyAIWMoqf3evfacjUlC/v99g=
|
||||||
|
|
||||||
|
classnames@^2.2.5:
|
||||||
|
version "2.2.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
|
||||||
|
integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
|
||||||
|
|
||||||
|
commander@^2.3.0:
|
||||||
|
version "2.20.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
||||||
|
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
|
||||||
|
|
||||||
|
core-js@^2.5.1:
|
||||||
|
version "2.6.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
|
||||||
|
integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
|
||||||
|
|
||||||
|
csstype@^2.2.0:
|
||||||
|
version "2.6.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.7.tgz#20b0024c20b6718f4eda3853a1f5a1cce7f5e4a5"
|
||||||
|
integrity sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==
|
||||||
|
|
||||||
|
d3-array@^1.2.0:
|
||||||
|
version "1.2.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
|
||||||
|
integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
|
||||||
|
|
||||||
|
d3-collection@1:
|
||||||
|
version "1.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
|
||||||
|
integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
|
||||||
|
|
||||||
|
d3-color@1:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.3.0.tgz#675818359074215b020dc1d41d518136dcb18fa9"
|
||||||
|
integrity sha512-NHODMBlj59xPAwl2BDiO2Mog6V+PrGRtBfWKqKRrs9MCqlSkIEb0Z/SfY7jW29ReHTDC/j+vwXhnZcXI3+3fbg==
|
||||||
|
|
||||||
|
d3-format@1:
|
||||||
|
version "1.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562"
|
||||||
|
integrity sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==
|
||||||
|
|
||||||
|
d3-interpolate@1, d3-interpolate@^1.3.0:
|
||||||
|
version "1.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68"
|
||||||
|
integrity sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==
|
||||||
|
dependencies:
|
||||||
|
d3-color "1"
|
||||||
|
|
||||||
|
d3-path@1:
|
||||||
|
version "1.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.8.tgz#4a0606a794d104513ec4a8af43525f374b278719"
|
||||||
|
integrity sha512-J6EfUNwcMQ+aM5YPOB8ZbgAZu6wc82f/0WFxrxwV6Ll8wBwLaHLKCqQ5Imub02JriCVVdPjgI+6P3a4EWJCxAg==
|
||||||
|
|
||||||
|
d3-scale@^2.1.0:
|
||||||
|
version "2.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f"
|
||||||
|
integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==
|
||||||
|
dependencies:
|
||||||
|
d3-array "^1.2.0"
|
||||||
|
d3-collection "1"
|
||||||
|
d3-format "1"
|
||||||
|
d3-interpolate "1"
|
||||||
|
d3-time "1"
|
||||||
|
d3-time-format "2"
|
||||||
|
|
||||||
|
d3-shape@^1.2.0:
|
||||||
|
version "1.3.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.5.tgz#e81aea5940f59f0a79cfccac012232a8987c6033"
|
||||||
|
integrity sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==
|
||||||
|
dependencies:
|
||||||
|
d3-path "1"
|
||||||
|
|
||||||
|
d3-time-format@2:
|
||||||
|
version "2.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b"
|
||||||
|
integrity sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==
|
||||||
|
dependencies:
|
||||||
|
d3-time "1"
|
||||||
|
|
||||||
|
d3-time@1:
|
||||||
|
version "1.0.11"
|
||||||
|
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.11.tgz#1d831a3e25cd189eb256c17770a666368762bbce"
|
||||||
|
integrity sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==
|
||||||
|
|
||||||
|
debug@~2.6.3:
|
||||||
|
version "2.6.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||||
|
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
|
||||||
|
dependencies:
|
||||||
|
ms "2.0.0"
|
||||||
|
|
||||||
|
decimal.js-light@^2.4.1:
|
||||||
|
version "2.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.0.tgz#ca7faf504c799326df94b0ab920424fdfc125348"
|
||||||
|
integrity sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg==
|
||||||
|
|
||||||
|
dom-helpers@^3.4.0:
|
||||||
|
version "3.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
|
||||||
|
integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.1.2"
|
||||||
|
|
||||||
|
"js-tokens@^3.0.0 || ^4.0.0":
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||||
|
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
||||||
|
|
||||||
|
lodash.debounce@^4.0.8:
|
||||||
|
version "4.0.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
|
||||||
|
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
|
||||||
|
|
||||||
|
lodash.throttle@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
|
||||||
|
integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
|
||||||
|
|
||||||
|
lodash@^4.17.5, lodash@~4.17.4:
|
||||||
|
version "4.17.15"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||||
|
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||||
|
|
||||||
|
loose-envify@^1.4.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
||||||
|
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
||||||
|
dependencies:
|
||||||
|
js-tokens "^3.0.0 || ^4.0.0"
|
||||||
|
|
||||||
|
math-expression-evaluator@^1.2.14:
|
||||||
|
version "1.2.17"
|
||||||
|
resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
|
||||||
|
integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw=
|
||||||
|
|
||||||
|
ms@2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||||
|
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||||
|
|
||||||
|
node-forge@^0.7.1:
|
||||||
|
version "0.7.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
|
||||||
|
integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==
|
||||||
|
|
||||||
|
object-assign@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
|
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
||||||
|
|
||||||
|
performance-now@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||||
|
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||||
|
|
||||||
|
prop-types@^15.6.0, prop-types@^15.6.2:
|
||||||
|
version "15.7.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
|
||||||
|
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
|
||||||
|
dependencies:
|
||||||
|
loose-envify "^1.4.0"
|
||||||
|
object-assign "^4.1.1"
|
||||||
|
react-is "^16.8.1"
|
||||||
|
|
||||||
|
raf@^3.4.0:
|
||||||
|
version "3.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
|
||||||
|
integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
|
||||||
|
dependencies:
|
||||||
|
performance-now "^2.1.0"
|
||||||
|
|
||||||
|
react-is@^16.8.1:
|
||||||
|
version "16.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb"
|
||||||
|
integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==
|
||||||
|
|
||||||
|
react-lifecycles-compat@^3.0.4:
|
||||||
|
version "3.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
|
||||||
|
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
|
||||||
|
|
||||||
|
react-resize-detector@^2.3.0:
|
||||||
|
version "2.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-2.3.0.tgz#57bad1ae26a28a62a2ddb678ba6ffdf8fa2b599c"
|
||||||
|
integrity sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==
|
||||||
|
dependencies:
|
||||||
|
lodash.debounce "^4.0.8"
|
||||||
|
lodash.throttle "^4.1.1"
|
||||||
|
prop-types "^15.6.0"
|
||||||
|
resize-observer-polyfill "^1.5.0"
|
||||||
|
|
||||||
|
react-smooth@^1.0.0:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.2.tgz#f7a2d932ece8db898646078c3c97f3e9533e0486"
|
||||||
|
integrity sha512-pIGzL1g9VGAsRsdZQokIK0vrCkcdKtnOnS1gyB2rrowdLy69lNSWoIjCTWAfgbiYvria8tm5hEZqj+jwXMkV4A==
|
||||||
|
dependencies:
|
||||||
|
lodash "~4.17.4"
|
||||||
|
prop-types "^15.6.0"
|
||||||
|
raf "^3.4.0"
|
||||||
|
react-transition-group "^2.5.0"
|
||||||
|
|
||||||
|
react-transition-group@^2.5.0:
|
||||||
|
version "2.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
|
||||||
|
integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
|
||||||
|
dependencies:
|
||||||
|
dom-helpers "^3.4.0"
|
||||||
|
loose-envify "^1.4.0"
|
||||||
|
prop-types "^15.6.2"
|
||||||
|
react-lifecycles-compat "^3.0.4"
|
||||||
|
|
||||||
|
recharts-scale@^0.4.2:
|
||||||
|
version "0.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.2.tgz#b66315d985cd9b80d5f7d977a5aab9a305abc354"
|
||||||
|
integrity sha512-p/cKt7j17D1CImLgX2f5+6IXLbRHGUQkogIp06VUoci/XkhOQiGSzUrsD1uRmiI7jha4u8XNFOjkHkzzBPivMg==
|
||||||
|
dependencies:
|
||||||
|
decimal.js-light "^2.4.1"
|
||||||
|
|
||||||
|
recharts@1.7.1:
|
||||||
|
version "1.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.7.1.tgz#bed7c9427fa0049090447070af185557f5569b06"
|
||||||
|
integrity sha512-i4vK/ZSICr+dXGmaijuNybc+xhctiX0464xnqauY+OvE6WvU5v+0GYciQvD/HJSObkKG4wY8aRtiuUL9YtXnHQ==
|
||||||
|
dependencies:
|
||||||
|
classnames "^2.2.5"
|
||||||
|
core-js "^2.5.1"
|
||||||
|
d3-interpolate "^1.3.0"
|
||||||
|
d3-scale "^2.1.0"
|
||||||
|
d3-shape "^1.2.0"
|
||||||
|
lodash "^4.17.5"
|
||||||
|
prop-types "^15.6.0"
|
||||||
|
react-resize-detector "^2.3.0"
|
||||||
|
react-smooth "^1.0.0"
|
||||||
|
recharts-scale "^0.4.2"
|
||||||
|
reduce-css-calc "^1.3.0"
|
||||||
|
|
||||||
|
reduce-css-calc@^1.3.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
|
||||||
|
integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=
|
||||||
|
dependencies:
|
||||||
|
balanced-match "^0.4.2"
|
||||||
|
math-expression-evaluator "^1.2.14"
|
||||||
|
reduce-function-call "^1.0.1"
|
||||||
|
|
||||||
|
reduce-function-call@^1.0.1:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
|
||||||
|
integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=
|
||||||
|
dependencies:
|
||||||
|
balanced-match "^0.4.2"
|
||||||
|
|
||||||
|
regenerator-runtime@^0.13.2:
|
||||||
|
version "0.13.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
|
||||||
|
integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
|
||||||
|
|
||||||
|
resize-observer-polyfill@^1.5.0:
|
||||||
|
version "1.5.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
|
||||||
|
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
|
||||||
|
|
||||||
|
split@~0.3.3:
|
||||||
|
version "0.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
|
||||||
|
integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
|
||||||
|
dependencies:
|
||||||
|
through "2"
|
||||||
|
|
||||||
|
through@2:
|
||||||
|
version "2.3.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||||
|
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||||
Reference in New Issue
Block a user