├── .gitignore
├── Dockerfile
├── Dockerfile-reactapp
├── README.md
├── package-lock.json
├── package.json
└── react-app
├── .env
├── .gitignore
├── package-lock.json
├── package.json
├── server
├── controllers
│ ├── connectController.js
│ ├── cookieController.js
│ └── kafkaController.js
├── producer.js
├── server.js
└── websocketKafkaNode.js
├── src
├── app.scss
├── app.tsx
├── assets
│ ├── KafkaSentinelDarkerLogo.png
│ └── KafkaSentinelLogo.jpg
├── components
│ ├── LineChart.tsx
│ └── metricGraph.tsx
├── containers
│ ├── Connect.tsx
│ ├── MainContainer.tsx
│ ├── Metrics.tsx
│ └── NavBarContainer.tsx
├── index.html
├── index.scss
└── index.tsx
├── tsconfig.json
└── webpack.config.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:14
2 | #current node version is 14.16.1
3 | WORKDIR /app
4 | COPY package*.json ./
5 | RUN npm install
6 | COPY . .
7 | #RUN npm run dev
8 | EXPOSE 3000
9 | ENTRYPOINT [ "npm", "start" ]
10 |
--------------------------------------------------------------------------------
/Dockerfile-reactapp:
--------------------------------------------------------------------------------
1 | FROM node:10.1
2 | WORKDIR /usr/src/app
3 | COPY ./reactapp /usr/src/reactapp
4 | RUN npm install
5 | RUN node run dev
6 | EXPOSE 3000
7 | ENTRYPOINT [ "node", "run dev" ]
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
KafkaSentinel
10 |
11 | Kafka Cluster Monitoring
12 |
13 | website
14 |
15 |
16 |
17 |
18 |
19 |
20 | ## About The Project
21 |
22 | KafkaSentinel is a web application that utilizes WebSockets to directly send metrics from the Kafka cluster to the front end client.
23 |
24 | ## Built With
25 | KafkaJS
26 |
27 | Websockets
28 |
29 | React
30 |
31 | NodeJS/Express
32 |
33 | Webpack
34 |
35 |
36 | ## Features
37 |
38 | Charts displaying throughput and other metrics in real time
39 |
40 | The ability to interact directly with your cluster including creating additional partitions, topics, consumers, and producers
41 |
42 | ## Getting Started
43 |
44 | Install KafkaSentinel? Run our docker?
45 |
46 | Once installed you can require the necessary components.
47 |
48 | How to Use
49 | Code snippets go here detailing instructions for how to use KafkaSentinel
50 |
51 | ## Contributors
52 |
53 | KafkaSentinel is an open-source community project on Github. A small group of engineers maintain it but we accept bug fixes, feature development and other contributions from the community.
54 |
55 | Hamilton Yu - [Github](https://github.com/HamiltonHYu/) - [Linkedin](https://www.linkedin.com/in/hamilton-yu/)
56 |
57 | John Maltese - [Github](https://github.com/j-maltese) - [Linkedin](https://www.linkedin.com/in/john-maltese/)
58 |
59 | Matthew Lai - [Github](https://github.com/matthewlai93) - [Linkedin](https://www.linkedin.com/in/matthew-a-lai/)
60 |
61 | Nitin Kumar - [Github](https://github.com/realNitinKumar) - [Linkedin](https://www.linkedin.com/in/realNitinKumar/)
62 |
63 | We are also open to open source projects that build upon KafkaSentinel so please feel free to reach out and we will gladly provide as much feedback and support as we are able.
64 |
65 | ## License
66 |
67 | This product is licensed under the MIT License - see the License.md file for details.
68 |
69 | This is an open source pproduct. We are neither affiliated nor endorsed by either Apache Software Foundation or KafkaJS.
70 |
71 | This product has been accelerated by [OS Labs](https://opensourcelabs.io/)
72 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "requires": true,
3 | "lockfileVersion": 1,
4 | "dependencies": {
5 | "@babel/runtime": {
6 | "version": "7.14.6",
7 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz",
8 | "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==",
9 | "requires": {
10 | "regenerator-runtime": "^0.13.4"
11 | }
12 | },
13 | "@emotion/hash": {
14 | "version": "0.8.0",
15 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
16 | "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
17 | },
18 | "@gulp-sourcemaps/map-sources": {
19 | "version": "1.0.0",
20 | "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
21 | "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
22 | "requires": {
23 | "normalize-path": "^2.0.1",
24 | "through2": "^2.0.3"
25 | }
26 | },
27 | "@material-ui/core": {
28 | "version": "4.12.1",
29 | "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.1.tgz",
30 | "integrity": "sha512-C6hYsjkWCTfBx9FaqxhCZCITBagh7fyCKFtHyvO3tTOcBw6NJaktdhNZ2n82jQdQdgfFvg6OOxi7OOzsAdAcBQ==",
31 | "requires": {
32 | "@babel/runtime": "^7.4.4",
33 | "@material-ui/styles": "^4.11.4",
34 | "@material-ui/system": "^4.12.1",
35 | "@material-ui/types": "5.1.0",
36 | "@material-ui/utils": "^4.11.2",
37 | "@types/react-transition-group": "^4.2.0",
38 | "clsx": "^1.0.4",
39 | "hoist-non-react-statics": "^3.3.2",
40 | "popper.js": "1.16.1-lts",
41 | "prop-types": "^15.7.2",
42 | "react-is": "^16.8.0 || ^17.0.0",
43 | "react-transition-group": "^4.4.0"
44 | }
45 | },
46 | "@material-ui/styles": {
47 | "version": "4.11.4",
48 | "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz",
49 | "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==",
50 | "requires": {
51 | "@babel/runtime": "^7.4.4",
52 | "@emotion/hash": "^0.8.0",
53 | "@material-ui/types": "5.1.0",
54 | "@material-ui/utils": "^4.11.2",
55 | "clsx": "^1.0.4",
56 | "csstype": "^2.5.2",
57 | "hoist-non-react-statics": "^3.3.2",
58 | "jss": "^10.5.1",
59 | "jss-plugin-camel-case": "^10.5.1",
60 | "jss-plugin-default-unit": "^10.5.1",
61 | "jss-plugin-global": "^10.5.1",
62 | "jss-plugin-nested": "^10.5.1",
63 | "jss-plugin-props-sort": "^10.5.1",
64 | "jss-plugin-rule-value-function": "^10.5.1",
65 | "jss-plugin-vendor-prefixer": "^10.5.1",
66 | "prop-types": "^15.7.2"
67 | }
68 | },
69 | "@material-ui/system": {
70 | "version": "4.12.1",
71 | "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz",
72 | "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==",
73 | "requires": {
74 | "@babel/runtime": "^7.4.4",
75 | "@material-ui/utils": "^4.11.2",
76 | "csstype": "^2.5.2",
77 | "prop-types": "^15.7.2"
78 | }
79 | },
80 | "@material-ui/types": {
81 | "version": "5.1.0",
82 | "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz",
83 | "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A=="
84 | },
85 | "@material-ui/utils": {
86 | "version": "4.11.2",
87 | "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz",
88 | "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==",
89 | "requires": {
90 | "@babel/runtime": "^7.4.4",
91 | "prop-types": "^15.7.2",
92 | "react-is": "^16.8.0 || ^17.0.0"
93 | }
94 | },
95 | "@types/component-emitter": {
96 | "version": "1.2.10",
97 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
98 | "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
99 | },
100 | "@types/cookie": {
101 | "version": "0.4.1",
102 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
103 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
104 | },
105 | "@types/cors": {
106 | "version": "2.8.12",
107 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
108 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
109 | },
110 | "@types/node": {
111 | "version": "16.3.2",
112 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.2.tgz",
113 | "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw=="
114 | },
115 | "@types/prop-types": {
116 | "version": "15.7.4",
117 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
118 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
119 | },
120 | "@types/react": {
121 | "version": "17.0.14",
122 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz",
123 | "integrity": "sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ==",
124 | "requires": {
125 | "@types/prop-types": "*",
126 | "@types/scheduler": "*",
127 | "csstype": "^3.0.2"
128 | },
129 | "dependencies": {
130 | "csstype": {
131 | "version": "3.0.8",
132 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
133 | "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
134 | }
135 | }
136 | },
137 | "@types/react-transition-group": {
138 | "version": "4.4.2",
139 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz",
140 | "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==",
141 | "requires": {
142 | "@types/react": "*"
143 | }
144 | },
145 | "@types/scheduler": {
146 | "version": "0.16.2",
147 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
148 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
149 | },
150 | "EventEmitter": {
151 | "version": "1.0.0",
152 | "resolved": "https://registry.npmjs.org/EventEmitter/-/EventEmitter-1.0.0.tgz",
153 | "integrity": "sha1-JJJKCpK7ps1uL5IrE92oErGKtHE=",
154 | "requires": {
155 | "gulp-babel": "^6.1.2",
156 | "gulp-eslint": "^2.0.0",
157 | "gulp-rename": "^1.2.2",
158 | "gulp-size": "^2.1.0",
159 | "gulp-sourcemaps": "^1.6.0",
160 | "gulp-uglify": "^1.5.3"
161 | }
162 | },
163 | "accepts": {
164 | "version": "1.3.7",
165 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
166 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
167 | "requires": {
168 | "mime-types": "~2.1.24",
169 | "negotiator": "0.6.2"
170 | }
171 | },
172 | "acorn": {
173 | "version": "5.7.4",
174 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
175 | "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="
176 | },
177 | "acorn-jsx": {
178 | "version": "3.0.1",
179 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
180 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
181 | "requires": {
182 | "acorn": "^3.0.4"
183 | },
184 | "dependencies": {
185 | "acorn": {
186 | "version": "3.3.0",
187 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
188 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
189 | }
190 | }
191 | },
192 | "ajv": {
193 | "version": "4.11.8",
194 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
195 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
196 | "requires": {
197 | "co": "^4.6.0",
198 | "json-stable-stringify": "^1.0.1"
199 | }
200 | },
201 | "ajv-keywords": {
202 | "version": "1.5.1",
203 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
204 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw="
205 | },
206 | "align-text": {
207 | "version": "0.1.4",
208 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
209 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
210 | "requires": {
211 | "kind-of": "^3.0.2",
212 | "longest": "^1.0.1",
213 | "repeat-string": "^1.5.2"
214 | }
215 | },
216 | "ansi-colors": {
217 | "version": "1.1.0",
218 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
219 | "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
220 | "requires": {
221 | "ansi-wrap": "^0.1.0"
222 | }
223 | },
224 | "ansi-escapes": {
225 | "version": "1.4.0",
226 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
227 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
228 | },
229 | "ansi-gray": {
230 | "version": "0.1.1",
231 | "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
232 | "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
233 | "requires": {
234 | "ansi-wrap": "0.1.0"
235 | }
236 | },
237 | "ansi-regex": {
238 | "version": "2.1.1",
239 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
240 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
241 | },
242 | "ansi-styles": {
243 | "version": "2.2.1",
244 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
245 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
246 | },
247 | "ansi-wrap": {
248 | "version": "0.1.0",
249 | "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
250 | "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
251 | },
252 | "argparse": {
253 | "version": "1.0.10",
254 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
255 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
256 | "requires": {
257 | "sprintf-js": "~1.0.2"
258 | }
259 | },
260 | "arr-diff": {
261 | "version": "4.0.0",
262 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
263 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
264 | },
265 | "arr-union": {
266 | "version": "3.1.0",
267 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
268 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
269 | },
270 | "array-differ": {
271 | "version": "1.0.0",
272 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
273 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
274 | },
275 | "array-uniq": {
276 | "version": "1.0.3",
277 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
278 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
279 | },
280 | "assign-symbols": {
281 | "version": "1.0.0",
282 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
283 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
284 | },
285 | "async": {
286 | "version": "0.2.10",
287 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
288 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
289 | },
290 | "atob": {
291 | "version": "2.1.2",
292 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
293 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
294 | },
295 | "babel-code-frame": {
296 | "version": "6.26.0",
297 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
298 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
299 | "requires": {
300 | "chalk": "^1.1.3",
301 | "esutils": "^2.0.2",
302 | "js-tokens": "^3.0.2"
303 | },
304 | "dependencies": {
305 | "js-tokens": {
306 | "version": "3.0.2",
307 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
308 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
309 | }
310 | }
311 | },
312 | "babel-core": {
313 | "version": "6.26.3",
314 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
315 | "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
316 | "requires": {
317 | "babel-code-frame": "^6.26.0",
318 | "babel-generator": "^6.26.0",
319 | "babel-helpers": "^6.24.1",
320 | "babel-messages": "^6.23.0",
321 | "babel-register": "^6.26.0",
322 | "babel-runtime": "^6.26.0",
323 | "babel-template": "^6.26.0",
324 | "babel-traverse": "^6.26.0",
325 | "babel-types": "^6.26.0",
326 | "babylon": "^6.18.0",
327 | "convert-source-map": "^1.5.1",
328 | "debug": "^2.6.9",
329 | "json5": "^0.5.1",
330 | "lodash": "^4.17.4",
331 | "minimatch": "^3.0.4",
332 | "path-is-absolute": "^1.0.1",
333 | "private": "^0.1.8",
334 | "slash": "^1.0.0",
335 | "source-map": "^0.5.7"
336 | },
337 | "dependencies": {
338 | "debug": {
339 | "version": "2.6.9",
340 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
341 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
342 | "requires": {
343 | "ms": "2.0.0"
344 | }
345 | },
346 | "ms": {
347 | "version": "2.0.0",
348 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
349 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
350 | }
351 | }
352 | },
353 | "babel-generator": {
354 | "version": "6.26.1",
355 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
356 | "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
357 | "requires": {
358 | "babel-messages": "^6.23.0",
359 | "babel-runtime": "^6.26.0",
360 | "babel-types": "^6.26.0",
361 | "detect-indent": "^4.0.0",
362 | "jsesc": "^1.3.0",
363 | "lodash": "^4.17.4",
364 | "source-map": "^0.5.7",
365 | "trim-right": "^1.0.1"
366 | }
367 | },
368 | "babel-helpers": {
369 | "version": "6.24.1",
370 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
371 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
372 | "requires": {
373 | "babel-runtime": "^6.22.0",
374 | "babel-template": "^6.24.1"
375 | }
376 | },
377 | "babel-messages": {
378 | "version": "6.23.0",
379 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
380 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
381 | "requires": {
382 | "babel-runtime": "^6.22.0"
383 | }
384 | },
385 | "babel-register": {
386 | "version": "6.26.0",
387 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
388 | "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
389 | "requires": {
390 | "babel-core": "^6.26.0",
391 | "babel-runtime": "^6.26.0",
392 | "core-js": "^2.5.0",
393 | "home-or-tmp": "^2.0.0",
394 | "lodash": "^4.17.4",
395 | "mkdirp": "^0.5.1",
396 | "source-map-support": "^0.4.15"
397 | }
398 | },
399 | "babel-runtime": {
400 | "version": "6.26.0",
401 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
402 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
403 | "requires": {
404 | "core-js": "^2.4.0",
405 | "regenerator-runtime": "^0.11.0"
406 | },
407 | "dependencies": {
408 | "regenerator-runtime": {
409 | "version": "0.11.1",
410 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
411 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
412 | }
413 | }
414 | },
415 | "babel-template": {
416 | "version": "6.26.0",
417 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
418 | "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
419 | "requires": {
420 | "babel-runtime": "^6.26.0",
421 | "babel-traverse": "^6.26.0",
422 | "babel-types": "^6.26.0",
423 | "babylon": "^6.18.0",
424 | "lodash": "^4.17.4"
425 | }
426 | },
427 | "babel-traverse": {
428 | "version": "6.26.0",
429 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
430 | "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
431 | "requires": {
432 | "babel-code-frame": "^6.26.0",
433 | "babel-messages": "^6.23.0",
434 | "babel-runtime": "^6.26.0",
435 | "babel-types": "^6.26.0",
436 | "babylon": "^6.18.0",
437 | "debug": "^2.6.8",
438 | "globals": "^9.18.0",
439 | "invariant": "^2.2.2",
440 | "lodash": "^4.17.4"
441 | },
442 | "dependencies": {
443 | "debug": {
444 | "version": "2.6.9",
445 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
446 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
447 | "requires": {
448 | "ms": "2.0.0"
449 | }
450 | },
451 | "ms": {
452 | "version": "2.0.0",
453 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
454 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
455 | }
456 | }
457 | },
458 | "babel-types": {
459 | "version": "6.26.0",
460 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
461 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
462 | "requires": {
463 | "babel-runtime": "^6.26.0",
464 | "esutils": "^2.0.2",
465 | "lodash": "^4.17.4",
466 | "to-fast-properties": "^1.0.3"
467 | }
468 | },
469 | "babylon": {
470 | "version": "6.18.0",
471 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
472 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
473 | },
474 | "backo2": {
475 | "version": "1.0.2",
476 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
477 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
478 | },
479 | "balanced-match": {
480 | "version": "1.0.2",
481 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
482 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
483 | },
484 | "base64-arraybuffer": {
485 | "version": "0.1.4",
486 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
487 | "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
488 | },
489 | "base64id": {
490 | "version": "2.0.0",
491 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
492 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
493 | },
494 | "beeper": {
495 | "version": "1.1.1",
496 | "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
497 | "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak="
498 | },
499 | "brace-expansion": {
500 | "version": "1.1.11",
501 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
502 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
503 | "requires": {
504 | "balanced-match": "^1.0.0",
505 | "concat-map": "0.0.1"
506 | }
507 | },
508 | "buffer-from": {
509 | "version": "1.1.1",
510 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
511 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
512 | },
513 | "bufferstreams": {
514 | "version": "1.1.3",
515 | "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.1.3.tgz",
516 | "integrity": "sha512-HaJnVuslRF4g2kSDeyl++AaVizoitCpL9PglzCYwy0uHHyvWerfvEb8jWmYbF1z4kiVFolGomnxSGl+GUQp2jg==",
517 | "requires": {
518 | "readable-stream": "^2.0.2"
519 | }
520 | },
521 | "caller-path": {
522 | "version": "0.1.0",
523 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
524 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
525 | "requires": {
526 | "callsites": "^0.2.0"
527 | }
528 | },
529 | "callsites": {
530 | "version": "0.2.0",
531 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
532 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
533 | },
534 | "camelcase": {
535 | "version": "1.2.1",
536 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
537 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
538 | },
539 | "center-align": {
540 | "version": "0.1.3",
541 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
542 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
543 | "requires": {
544 | "align-text": "^0.1.3",
545 | "lazy-cache": "^1.0.3"
546 | }
547 | },
548 | "chalk": {
549 | "version": "1.1.3",
550 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
551 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
552 | "requires": {
553 | "ansi-styles": "^2.2.1",
554 | "escape-string-regexp": "^1.0.2",
555 | "has-ansi": "^2.0.0",
556 | "strip-ansi": "^3.0.0",
557 | "supports-color": "^2.0.0"
558 | }
559 | },
560 | "chart.js": {
561 | "version": "3.4.1",
562 | "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.4.1.tgz",
563 | "integrity": "sha512-0R4mL7WiBcYoazIhrzSYnWcOw6RmrRn7Q4nKZNsBQZCBrlkZKodQbfeojCCo8eETPRCs1ZNTsAcZhIfyhyP61g=="
564 | },
565 | "circular-json": {
566 | "version": "0.3.3",
567 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
568 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
569 | },
570 | "cjs-loader": {
571 | "version": "0.1.0",
572 | "resolved": "https://registry.npmjs.org/cjs-loader/-/cjs-loader-0.1.0.tgz",
573 | "integrity": "sha512-WgdnnrdNJT+ffiyU2S1zsrhbDjkDH4qgTbGYHPSN6XBVMSg1LbnSnUrVFMic4pWYypcTwkhoNfBB+GFP/73MHQ=="
574 | },
575 | "cli-cursor": {
576 | "version": "1.0.2",
577 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
578 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
579 | "requires": {
580 | "restore-cursor": "^1.0.1"
581 | }
582 | },
583 | "cli-width": {
584 | "version": "2.2.1",
585 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
586 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="
587 | },
588 | "cliui": {
589 | "version": "2.1.0",
590 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
591 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
592 | "requires": {
593 | "center-align": "^0.1.1",
594 | "right-align": "^0.1.1",
595 | "wordwrap": "0.0.2"
596 | }
597 | },
598 | "clone": {
599 | "version": "1.0.4",
600 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
601 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
602 | },
603 | "clone-stats": {
604 | "version": "0.0.1",
605 | "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
606 | "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
607 | },
608 | "clsx": {
609 | "version": "1.1.1",
610 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz",
611 | "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
612 | },
613 | "co": {
614 | "version": "4.6.0",
615 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
616 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
617 | },
618 | "code-point-at": {
619 | "version": "1.1.0",
620 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
621 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
622 | },
623 | "color-support": {
624 | "version": "1.1.3",
625 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
626 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
627 | },
628 | "component-emitter": {
629 | "version": "1.3.0",
630 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
631 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
632 | },
633 | "concat-map": {
634 | "version": "0.0.1",
635 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
636 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
637 | },
638 | "concat-stream": {
639 | "version": "1.6.2",
640 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
641 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
642 | "requires": {
643 | "buffer-from": "^1.0.0",
644 | "inherits": "^2.0.3",
645 | "readable-stream": "^2.2.2",
646 | "typedarray": "^0.0.6"
647 | }
648 | },
649 | "convert-source-map": {
650 | "version": "1.8.0",
651 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
652 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
653 | "requires": {
654 | "safe-buffer": "~5.1.1"
655 | }
656 | },
657 | "cookie": {
658 | "version": "0.4.1",
659 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
660 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
661 | },
662 | "core-js": {
663 | "version": "2.6.12",
664 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
665 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
666 | },
667 | "core-util-is": {
668 | "version": "1.0.2",
669 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
670 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
671 | },
672 | "cors": {
673 | "version": "2.8.5",
674 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
675 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
676 | "requires": {
677 | "object-assign": "^4",
678 | "vary": "^1"
679 | }
680 | },
681 | "css": {
682 | "version": "2.2.4",
683 | "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
684 | "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
685 | "requires": {
686 | "inherits": "^2.0.3",
687 | "source-map": "^0.6.1",
688 | "source-map-resolve": "^0.5.2",
689 | "urix": "^0.1.0"
690 | },
691 | "dependencies": {
692 | "source-map": {
693 | "version": "0.6.1",
694 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
695 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
696 | }
697 | }
698 | },
699 | "css-vendor": {
700 | "version": "2.0.8",
701 | "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz",
702 | "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==",
703 | "requires": {
704 | "@babel/runtime": "^7.8.3",
705 | "is-in-browser": "^1.0.2"
706 | }
707 | },
708 | "csstype": {
709 | "version": "2.6.17",
710 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz",
711 | "integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A=="
712 | },
713 | "d": {
714 | "version": "1.0.1",
715 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
716 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
717 | "requires": {
718 | "es5-ext": "^0.10.50",
719 | "type": "^1.0.1"
720 | }
721 | },
722 | "dateformat": {
723 | "version": "2.2.0",
724 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
725 | "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI="
726 | },
727 | "deap": {
728 | "version": "1.0.1",
729 | "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz",
730 | "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw=="
731 | },
732 | "debug": {
733 | "version": "4.3.2",
734 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
735 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
736 | "requires": {
737 | "ms": "2.1.2"
738 | }
739 | },
740 | "debug-fabulous": {
741 | "version": "0.0.4",
742 | "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz",
743 | "integrity": "sha1-+gccXYdIRoVCSAdCHKSxawsaB2M=",
744 | "requires": {
745 | "debug": "2.X",
746 | "lazy-debug-legacy": "0.0.X",
747 | "object-assign": "4.1.0"
748 | },
749 | "dependencies": {
750 | "debug": {
751 | "version": "2.6.9",
752 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
753 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
754 | "requires": {
755 | "ms": "2.0.0"
756 | }
757 | },
758 | "ms": {
759 | "version": "2.0.0",
760 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
761 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
762 | },
763 | "object-assign": {
764 | "version": "4.1.0",
765 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
766 | "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A="
767 | }
768 | }
769 | },
770 | "decamelize": {
771 | "version": "1.2.0",
772 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
773 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
774 | },
775 | "decode-uri-component": {
776 | "version": "0.2.0",
777 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
778 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
779 | },
780 | "deep-is": {
781 | "version": "0.1.3",
782 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
783 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
784 | },
785 | "detect-indent": {
786 | "version": "4.0.0",
787 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
788 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
789 | "requires": {
790 | "repeating": "^2.0.0"
791 | }
792 | },
793 | "detect-newline": {
794 | "version": "2.1.0",
795 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
796 | "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I="
797 | },
798 | "doctrine": {
799 | "version": "1.5.0",
800 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
801 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
802 | "requires": {
803 | "esutils": "^2.0.2",
804 | "isarray": "^1.0.0"
805 | }
806 | },
807 | "dom-helpers": {
808 | "version": "5.2.1",
809 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
810 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
811 | "requires": {
812 | "@babel/runtime": "^7.8.7",
813 | "csstype": "^3.0.2"
814 | },
815 | "dependencies": {
816 | "csstype": {
817 | "version": "3.0.8",
818 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
819 | "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
820 | }
821 | }
822 | },
823 | "duplexer": {
824 | "version": "0.1.2",
825 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
826 | "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
827 | },
828 | "duplexer2": {
829 | "version": "0.0.2",
830 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
831 | "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
832 | "requires": {
833 | "readable-stream": "~1.1.9"
834 | },
835 | "dependencies": {
836 | "isarray": {
837 | "version": "0.0.1",
838 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
839 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
840 | },
841 | "readable-stream": {
842 | "version": "1.1.14",
843 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
844 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
845 | "requires": {
846 | "core-util-is": "~1.0.0",
847 | "inherits": "~2.0.1",
848 | "isarray": "0.0.1",
849 | "string_decoder": "~0.10.x"
850 | }
851 | },
852 | "string_decoder": {
853 | "version": "0.10.31",
854 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
855 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
856 | }
857 | }
858 | },
859 | "engine.io": {
860 | "version": "5.1.1",
861 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz",
862 | "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==",
863 | "requires": {
864 | "accepts": "~1.3.4",
865 | "base64id": "2.0.0",
866 | "cookie": "~0.4.1",
867 | "cors": "~2.8.5",
868 | "debug": "~4.3.1",
869 | "engine.io-parser": "~4.0.0",
870 | "ws": "~7.4.2"
871 | }
872 | },
873 | "engine.io-client": {
874 | "version": "5.1.2",
875 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.2.tgz",
876 | "integrity": "sha512-blRrgXIE0A/eurWXRzvfCLG7uUFJqfTGFsyJzXSK71srMMGJ2VraBLg8Mdw28uUxSpVicepBN9X7asqpD1mZcQ==",
877 | "requires": {
878 | "base64-arraybuffer": "0.1.4",
879 | "component-emitter": "~1.3.0",
880 | "debug": "~4.3.1",
881 | "engine.io-parser": "~4.0.1",
882 | "has-cors": "1.1.0",
883 | "parseqs": "0.0.6",
884 | "parseuri": "0.0.6",
885 | "ws": "~7.4.2",
886 | "yeast": "0.1.2"
887 | }
888 | },
889 | "engine.io-parser": {
890 | "version": "4.0.2",
891 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
892 | "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
893 | "requires": {
894 | "base64-arraybuffer": "0.1.4"
895 | }
896 | },
897 | "es5-ext": {
898 | "version": "0.10.53",
899 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
900 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
901 | "requires": {
902 | "es6-iterator": "~2.0.3",
903 | "es6-symbol": "~3.1.3",
904 | "next-tick": "~1.0.0"
905 | }
906 | },
907 | "es6-iterator": {
908 | "version": "2.0.3",
909 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
910 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
911 | "requires": {
912 | "d": "1",
913 | "es5-ext": "^0.10.35",
914 | "es6-symbol": "^3.1.1"
915 | }
916 | },
917 | "es6-map": {
918 | "version": "0.1.5",
919 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
920 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
921 | "requires": {
922 | "d": "1",
923 | "es5-ext": "~0.10.14",
924 | "es6-iterator": "~2.0.1",
925 | "es6-set": "~0.1.5",
926 | "es6-symbol": "~3.1.1",
927 | "event-emitter": "~0.3.5"
928 | }
929 | },
930 | "es6-set": {
931 | "version": "0.1.5",
932 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
933 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
934 | "requires": {
935 | "d": "1",
936 | "es5-ext": "~0.10.14",
937 | "es6-iterator": "~2.0.1",
938 | "es6-symbol": "3.1.1",
939 | "event-emitter": "~0.3.5"
940 | },
941 | "dependencies": {
942 | "es6-symbol": {
943 | "version": "3.1.1",
944 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
945 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
946 | "requires": {
947 | "d": "1",
948 | "es5-ext": "~0.10.14"
949 | }
950 | }
951 | }
952 | },
953 | "es6-symbol": {
954 | "version": "3.1.3",
955 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
956 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
957 | "requires": {
958 | "d": "^1.0.1",
959 | "ext": "^1.1.2"
960 | }
961 | },
962 | "es6-weak-map": {
963 | "version": "2.0.3",
964 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
965 | "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
966 | "requires": {
967 | "d": "1",
968 | "es5-ext": "^0.10.46",
969 | "es6-iterator": "^2.0.3",
970 | "es6-symbol": "^3.1.1"
971 | }
972 | },
973 | "escape-string-regexp": {
974 | "version": "1.0.5",
975 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
976 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
977 | },
978 | "escope": {
979 | "version": "3.6.0",
980 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
981 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
982 | "requires": {
983 | "es6-map": "^0.1.3",
984 | "es6-weak-map": "^2.0.1",
985 | "esrecurse": "^4.1.0",
986 | "estraverse": "^4.1.1"
987 | }
988 | },
989 | "eslint": {
990 | "version": "2.13.1",
991 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz",
992 | "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=",
993 | "requires": {
994 | "chalk": "^1.1.3",
995 | "concat-stream": "^1.4.6",
996 | "debug": "^2.1.1",
997 | "doctrine": "^1.2.2",
998 | "es6-map": "^0.1.3",
999 | "escope": "^3.6.0",
1000 | "espree": "^3.1.6",
1001 | "estraverse": "^4.2.0",
1002 | "esutils": "^2.0.2",
1003 | "file-entry-cache": "^1.1.1",
1004 | "glob": "^7.0.3",
1005 | "globals": "^9.2.0",
1006 | "ignore": "^3.1.2",
1007 | "imurmurhash": "^0.1.4",
1008 | "inquirer": "^0.12.0",
1009 | "is-my-json-valid": "^2.10.0",
1010 | "is-resolvable": "^1.0.0",
1011 | "js-yaml": "^3.5.1",
1012 | "json-stable-stringify": "^1.0.0",
1013 | "levn": "^0.3.0",
1014 | "lodash": "^4.0.0",
1015 | "mkdirp": "^0.5.0",
1016 | "optionator": "^0.8.1",
1017 | "path-is-absolute": "^1.0.0",
1018 | "path-is-inside": "^1.0.1",
1019 | "pluralize": "^1.2.1",
1020 | "progress": "^1.1.8",
1021 | "require-uncached": "^1.0.2",
1022 | "shelljs": "^0.6.0",
1023 | "strip-json-comments": "~1.0.1",
1024 | "table": "^3.7.8",
1025 | "text-table": "~0.2.0",
1026 | "user-home": "^2.0.0"
1027 | },
1028 | "dependencies": {
1029 | "debug": {
1030 | "version": "2.6.9",
1031 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1032 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1033 | "requires": {
1034 | "ms": "2.0.0"
1035 | }
1036 | },
1037 | "ms": {
1038 | "version": "2.0.0",
1039 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1040 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1041 | }
1042 | }
1043 | },
1044 | "espree": {
1045 | "version": "3.5.4",
1046 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
1047 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
1048 | "requires": {
1049 | "acorn": "^5.5.0",
1050 | "acorn-jsx": "^3.0.0"
1051 | }
1052 | },
1053 | "esprima": {
1054 | "version": "4.0.1",
1055 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1056 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
1057 | },
1058 | "esrecurse": {
1059 | "version": "4.3.0",
1060 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1061 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1062 | "requires": {
1063 | "estraverse": "^5.2.0"
1064 | },
1065 | "dependencies": {
1066 | "estraverse": {
1067 | "version": "5.2.0",
1068 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
1069 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
1070 | }
1071 | }
1072 | },
1073 | "estraverse": {
1074 | "version": "4.3.0",
1075 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1076 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
1077 | },
1078 | "esutils": {
1079 | "version": "2.0.3",
1080 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1081 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
1082 | },
1083 | "event-emitter": {
1084 | "version": "0.3.5",
1085 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
1086 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
1087 | "requires": {
1088 | "d": "1",
1089 | "es5-ext": "~0.10.14"
1090 | }
1091 | },
1092 | "exit-hook": {
1093 | "version": "1.1.1",
1094 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
1095 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
1096 | },
1097 | "ext": {
1098 | "version": "1.4.0",
1099 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
1100 | "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
1101 | "requires": {
1102 | "type": "^2.0.0"
1103 | },
1104 | "dependencies": {
1105 | "type": {
1106 | "version": "2.5.0",
1107 | "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
1108 | "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
1109 | }
1110 | }
1111 | },
1112 | "extend-shallow": {
1113 | "version": "3.0.2",
1114 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
1115 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
1116 | "requires": {
1117 | "assign-symbols": "^1.0.0",
1118 | "is-extendable": "^1.0.1"
1119 | }
1120 | },
1121 | "fancy-log": {
1122 | "version": "1.3.3",
1123 | "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
1124 | "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
1125 | "requires": {
1126 | "ansi-gray": "^0.1.1",
1127 | "color-support": "^1.1.3",
1128 | "parse-node-version": "^1.0.0",
1129 | "time-stamp": "^1.0.0"
1130 | }
1131 | },
1132 | "fast-levenshtein": {
1133 | "version": "2.0.6",
1134 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1135 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
1136 | },
1137 | "figures": {
1138 | "version": "1.7.0",
1139 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
1140 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
1141 | "requires": {
1142 | "escape-string-regexp": "^1.0.5",
1143 | "object-assign": "^4.1.0"
1144 | }
1145 | },
1146 | "file-entry-cache": {
1147 | "version": "1.3.1",
1148 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz",
1149 | "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=",
1150 | "requires": {
1151 | "flat-cache": "^1.2.1",
1152 | "object-assign": "^4.0.1"
1153 | }
1154 | },
1155 | "flat-cache": {
1156 | "version": "1.3.4",
1157 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
1158 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
1159 | "requires": {
1160 | "circular-json": "^0.3.1",
1161 | "graceful-fs": "^4.1.2",
1162 | "rimraf": "~2.6.2",
1163 | "write": "^0.2.1"
1164 | }
1165 | },
1166 | "fs.realpath": {
1167 | "version": "1.0.0",
1168 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1169 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1170 | },
1171 | "generate-function": {
1172 | "version": "2.3.1",
1173 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
1174 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
1175 | "requires": {
1176 | "is-property": "^1.0.2"
1177 | }
1178 | },
1179 | "generate-object-property": {
1180 | "version": "1.2.0",
1181 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
1182 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
1183 | "requires": {
1184 | "is-property": "^1.0.0"
1185 | }
1186 | },
1187 | "glob": {
1188 | "version": "7.1.7",
1189 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
1190 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
1191 | "requires": {
1192 | "fs.realpath": "^1.0.0",
1193 | "inflight": "^1.0.4",
1194 | "inherits": "2",
1195 | "minimatch": "^3.0.4",
1196 | "once": "^1.3.0",
1197 | "path-is-absolute": "^1.0.0"
1198 | }
1199 | },
1200 | "globals": {
1201 | "version": "9.18.0",
1202 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
1203 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
1204 | },
1205 | "glogg": {
1206 | "version": "1.0.2",
1207 | "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
1208 | "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
1209 | "requires": {
1210 | "sparkles": "^1.0.0"
1211 | }
1212 | },
1213 | "graceful-fs": {
1214 | "version": "4.2.6",
1215 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
1216 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
1217 | },
1218 | "gulp-babel": {
1219 | "version": "6.1.3",
1220 | "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz",
1221 | "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==",
1222 | "requires": {
1223 | "babel-core": "^6.23.1",
1224 | "object-assign": "^4.0.1",
1225 | "plugin-error": "^1.0.1",
1226 | "replace-ext": "0.0.1",
1227 | "through2": "^2.0.0",
1228 | "vinyl-sourcemaps-apply": "^0.2.0"
1229 | }
1230 | },
1231 | "gulp-eslint": {
1232 | "version": "2.1.0",
1233 | "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-2.1.0.tgz",
1234 | "integrity": "sha1-P9X+C3I2ZR8VuNS/sUB8O3TQE2w=",
1235 | "requires": {
1236 | "bufferstreams": "^1.1.0",
1237 | "eslint": "^2.10.0",
1238 | "gulp-util": "^3.0.6",
1239 | "object-assign": "^4.1.0"
1240 | }
1241 | },
1242 | "gulp-rename": {
1243 | "version": "1.4.0",
1244 | "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz",
1245 | "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg=="
1246 | },
1247 | "gulp-size": {
1248 | "version": "2.1.0",
1249 | "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-2.1.0.tgz",
1250 | "integrity": "sha1-HCtk8X+QcdWr2Z0VS3s0gfj7oSg=",
1251 | "requires": {
1252 | "chalk": "^1.0.0",
1253 | "gulp-util": "^3.0.0",
1254 | "gzip-size": "^3.0.0",
1255 | "object-assign": "^4.0.1",
1256 | "pretty-bytes": "^3.0.1",
1257 | "stream-counter": "^1.0.0",
1258 | "through2": "^2.0.0"
1259 | }
1260 | },
1261 | "gulp-sourcemaps": {
1262 | "version": "1.12.1",
1263 | "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz",
1264 | "integrity": "sha1-tDfR89mAzyboEYSCNxjOFa5ll7Y=",
1265 | "requires": {
1266 | "@gulp-sourcemaps/map-sources": "1.X",
1267 | "acorn": "4.X",
1268 | "convert-source-map": "1.X",
1269 | "css": "2.X",
1270 | "debug-fabulous": "0.0.X",
1271 | "detect-newline": "2.X",
1272 | "graceful-fs": "4.X",
1273 | "source-map": "~0.6.0",
1274 | "strip-bom": "2.X",
1275 | "through2": "2.X",
1276 | "vinyl": "1.X"
1277 | },
1278 | "dependencies": {
1279 | "acorn": {
1280 | "version": "4.0.13",
1281 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
1282 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
1283 | },
1284 | "source-map": {
1285 | "version": "0.6.1",
1286 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1287 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1288 | }
1289 | }
1290 | },
1291 | "gulp-uglify": {
1292 | "version": "1.5.4",
1293 | "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz",
1294 | "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=",
1295 | "requires": {
1296 | "deap": "^1.0.0",
1297 | "fancy-log": "^1.0.0",
1298 | "gulp-util": "^3.0.0",
1299 | "isobject": "^2.0.0",
1300 | "through2": "^2.0.0",
1301 | "uglify-js": "2.6.4",
1302 | "uglify-save-license": "^0.4.1",
1303 | "vinyl-sourcemaps-apply": "^0.2.0"
1304 | }
1305 | },
1306 | "gulp-util": {
1307 | "version": "3.0.8",
1308 | "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
1309 | "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
1310 | "requires": {
1311 | "array-differ": "^1.0.0",
1312 | "array-uniq": "^1.0.2",
1313 | "beeper": "^1.0.0",
1314 | "chalk": "^1.0.0",
1315 | "dateformat": "^2.0.0",
1316 | "fancy-log": "^1.1.0",
1317 | "gulplog": "^1.0.0",
1318 | "has-gulplog": "^0.1.0",
1319 | "lodash._reescape": "^3.0.0",
1320 | "lodash._reevaluate": "^3.0.0",
1321 | "lodash._reinterpolate": "^3.0.0",
1322 | "lodash.template": "^3.0.0",
1323 | "minimist": "^1.1.0",
1324 | "multipipe": "^0.1.2",
1325 | "object-assign": "^3.0.0",
1326 | "replace-ext": "0.0.1",
1327 | "through2": "^2.0.0",
1328 | "vinyl": "^0.5.0"
1329 | },
1330 | "dependencies": {
1331 | "object-assign": {
1332 | "version": "3.0.0",
1333 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
1334 | "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
1335 | },
1336 | "vinyl": {
1337 | "version": "0.5.3",
1338 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
1339 | "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
1340 | "requires": {
1341 | "clone": "^1.0.0",
1342 | "clone-stats": "^0.0.1",
1343 | "replace-ext": "0.0.1"
1344 | }
1345 | }
1346 | }
1347 | },
1348 | "gulplog": {
1349 | "version": "1.0.0",
1350 | "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
1351 | "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
1352 | "requires": {
1353 | "glogg": "^1.0.0"
1354 | }
1355 | },
1356 | "gzip-size": {
1357 | "version": "3.0.0",
1358 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
1359 | "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
1360 | "requires": {
1361 | "duplexer": "^0.1.1"
1362 | }
1363 | },
1364 | "has-ansi": {
1365 | "version": "2.0.0",
1366 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1367 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1368 | "requires": {
1369 | "ansi-regex": "^2.0.0"
1370 | }
1371 | },
1372 | "has-cors": {
1373 | "version": "1.1.0",
1374 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
1375 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
1376 | },
1377 | "has-gulplog": {
1378 | "version": "0.1.0",
1379 | "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
1380 | "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
1381 | "requires": {
1382 | "sparkles": "^1.0.0"
1383 | }
1384 | },
1385 | "hoist-non-react-statics": {
1386 | "version": "3.3.2",
1387 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
1388 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
1389 | "requires": {
1390 | "react-is": "^16.7.0"
1391 | },
1392 | "dependencies": {
1393 | "react-is": {
1394 | "version": "16.13.1",
1395 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
1396 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
1397 | }
1398 | }
1399 | },
1400 | "home-or-tmp": {
1401 | "version": "2.0.0",
1402 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
1403 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
1404 | "requires": {
1405 | "os-homedir": "^1.0.0",
1406 | "os-tmpdir": "^1.0.1"
1407 | }
1408 | },
1409 | "hyphenate-style-name": {
1410 | "version": "1.0.4",
1411 | "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
1412 | "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
1413 | },
1414 | "ignore": {
1415 | "version": "3.3.10",
1416 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
1417 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
1418 | },
1419 | "imurmurhash": {
1420 | "version": "0.1.4",
1421 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1422 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
1423 | },
1424 | "inflight": {
1425 | "version": "1.0.6",
1426 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1427 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1428 | "requires": {
1429 | "once": "^1.3.0",
1430 | "wrappy": "1"
1431 | }
1432 | },
1433 | "inherits": {
1434 | "version": "2.0.4",
1435 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1436 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1437 | },
1438 | "inquirer": {
1439 | "version": "0.12.0",
1440 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
1441 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=",
1442 | "requires": {
1443 | "ansi-escapes": "^1.1.0",
1444 | "ansi-regex": "^2.0.0",
1445 | "chalk": "^1.0.0",
1446 | "cli-cursor": "^1.0.1",
1447 | "cli-width": "^2.0.0",
1448 | "figures": "^1.3.5",
1449 | "lodash": "^4.3.0",
1450 | "readline2": "^1.0.1",
1451 | "run-async": "^0.1.0",
1452 | "rx-lite": "^3.1.2",
1453 | "string-width": "^1.0.1",
1454 | "strip-ansi": "^3.0.0",
1455 | "through": "^2.3.6"
1456 | }
1457 | },
1458 | "invariant": {
1459 | "version": "2.2.4",
1460 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
1461 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
1462 | "requires": {
1463 | "loose-envify": "^1.0.0"
1464 | }
1465 | },
1466 | "is-buffer": {
1467 | "version": "1.1.6",
1468 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1469 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
1470 | },
1471 | "is-extendable": {
1472 | "version": "1.0.1",
1473 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1474 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1475 | "requires": {
1476 | "is-plain-object": "^2.0.4"
1477 | }
1478 | },
1479 | "is-finite": {
1480 | "version": "1.1.0",
1481 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
1482 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="
1483 | },
1484 | "is-fullwidth-code-point": {
1485 | "version": "1.0.0",
1486 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1487 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1488 | "requires": {
1489 | "number-is-nan": "^1.0.0"
1490 | }
1491 | },
1492 | "is-in-browser": {
1493 | "version": "1.1.3",
1494 | "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz",
1495 | "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU="
1496 | },
1497 | "is-my-ip-valid": {
1498 | "version": "1.0.0",
1499 | "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
1500 | "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
1501 | },
1502 | "is-my-json-valid": {
1503 | "version": "2.20.5",
1504 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz",
1505 | "integrity": "sha512-VTPuvvGQtxvCeghwspQu1rBgjYUT6FGxPlvFKbYuFtgc4ADsX3U5ihZOYN0qyU6u+d4X9xXb0IT5O6QpXKt87A==",
1506 | "requires": {
1507 | "generate-function": "^2.0.0",
1508 | "generate-object-property": "^1.1.0",
1509 | "is-my-ip-valid": "^1.0.0",
1510 | "jsonpointer": "^4.0.0",
1511 | "xtend": "^4.0.0"
1512 | }
1513 | },
1514 | "is-plain-object": {
1515 | "version": "2.0.4",
1516 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
1517 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
1518 | "requires": {
1519 | "isobject": "^3.0.1"
1520 | },
1521 | "dependencies": {
1522 | "isobject": {
1523 | "version": "3.0.1",
1524 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
1525 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
1526 | }
1527 | }
1528 | },
1529 | "is-property": {
1530 | "version": "1.0.2",
1531 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
1532 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
1533 | },
1534 | "is-resolvable": {
1535 | "version": "1.1.0",
1536 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
1537 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
1538 | },
1539 | "is-utf8": {
1540 | "version": "0.2.1",
1541 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1542 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
1543 | },
1544 | "isarray": {
1545 | "version": "1.0.0",
1546 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1547 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1548 | },
1549 | "isobject": {
1550 | "version": "2.1.0",
1551 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
1552 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
1553 | "requires": {
1554 | "isarray": "1.0.0"
1555 | }
1556 | },
1557 | "js-tokens": {
1558 | "version": "4.0.0",
1559 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1560 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1561 | },
1562 | "js-yaml": {
1563 | "version": "3.14.1",
1564 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
1565 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
1566 | "requires": {
1567 | "argparse": "^1.0.7",
1568 | "esprima": "^4.0.0"
1569 | }
1570 | },
1571 | "jsesc": {
1572 | "version": "1.3.0",
1573 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
1574 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
1575 | },
1576 | "json-stable-stringify": {
1577 | "version": "1.0.1",
1578 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
1579 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
1580 | "requires": {
1581 | "jsonify": "~0.0.0"
1582 | }
1583 | },
1584 | "json5": {
1585 | "version": "0.5.1",
1586 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
1587 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
1588 | },
1589 | "jsonify": {
1590 | "version": "0.0.0",
1591 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
1592 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
1593 | },
1594 | "jsonpointer": {
1595 | "version": "4.1.0",
1596 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.1.0.tgz",
1597 | "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg=="
1598 | },
1599 | "jss": {
1600 | "version": "10.7.1",
1601 | "resolved": "https://registry.npmjs.org/jss/-/jss-10.7.1.tgz",
1602 | "integrity": "sha512-5QN8JSVZR6cxpZNeGfzIjqPEP+ZJwJJfZbXmeABNdxiExyO+eJJDy6WDtqTf8SDKnbL5kZllEpAP71E/Lt7PXg==",
1603 | "requires": {
1604 | "@babel/runtime": "^7.3.1",
1605 | "csstype": "^3.0.2",
1606 | "is-in-browser": "^1.1.3",
1607 | "tiny-warning": "^1.0.2"
1608 | },
1609 | "dependencies": {
1610 | "csstype": {
1611 | "version": "3.0.8",
1612 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
1613 | "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
1614 | }
1615 | }
1616 | },
1617 | "jss-plugin-camel-case": {
1618 | "version": "10.7.1",
1619 | "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.7.1.tgz",
1620 | "integrity": "sha512-+ioIyWvmAfgDCWXsQcW1NMnLBvRinOVFkSYJUgewQ6TynOcSj5F1bSU23B7z0p1iqK0PPHIU62xY1iNJD33WGA==",
1621 | "requires": {
1622 | "@babel/runtime": "^7.3.1",
1623 | "hyphenate-style-name": "^1.0.3",
1624 | "jss": "10.7.1"
1625 | }
1626 | },
1627 | "jss-plugin-default-unit": {
1628 | "version": "10.7.1",
1629 | "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.7.1.tgz",
1630 | "integrity": "sha512-tW+dfYVNARBQb/ONzBwd8uyImigyzMiAEDai+AbH5rcHg5h3TtqhAkxx06iuZiT/dZUiFdSKlbe3q9jZGAPIwA==",
1631 | "requires": {
1632 | "@babel/runtime": "^7.3.1",
1633 | "jss": "10.7.1"
1634 | }
1635 | },
1636 | "jss-plugin-global": {
1637 | "version": "10.7.1",
1638 | "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.7.1.tgz",
1639 | "integrity": "sha512-FbxCnu44IkK/bw8X3CwZKmcAnJqjAb9LujlAc/aP0bMSdVa3/MugKQRyeQSu00uGL44feJJDoeXXiHOakBr/Zw==",
1640 | "requires": {
1641 | "@babel/runtime": "^7.3.1",
1642 | "jss": "10.7.1"
1643 | }
1644 | },
1645 | "jss-plugin-nested": {
1646 | "version": "10.7.1",
1647 | "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.7.1.tgz",
1648 | "integrity": "sha512-RNbICk7FlYKaJyv9tkMl7s6FFfeLA3ubNIFKvPqaWtADK0KUaPsPXVYBkAu4x1ItgsWx67xvReMrkcKA0jSXfA==",
1649 | "requires": {
1650 | "@babel/runtime": "^7.3.1",
1651 | "jss": "10.7.1",
1652 | "tiny-warning": "^1.0.2"
1653 | }
1654 | },
1655 | "jss-plugin-props-sort": {
1656 | "version": "10.7.1",
1657 | "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.7.1.tgz",
1658 | "integrity": "sha512-eyd5FhA+J0QrpqXxO7YNF/HMSXXl4pB0EmUdY4vSJI4QG22F59vQ6AHtP6fSwhmBdQ98Qd9gjfO+RMxcE39P1A==",
1659 | "requires": {
1660 | "@babel/runtime": "^7.3.1",
1661 | "jss": "10.7.1"
1662 | }
1663 | },
1664 | "jss-plugin-rule-value-function": {
1665 | "version": "10.7.1",
1666 | "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.7.1.tgz",
1667 | "integrity": "sha512-fGAAImlbaHD3fXAHI3ooX6aRESOl5iBt3LjpVjxs9II5u9tzam7pqFUmgTcrip9VpRqYHn8J3gA7kCtm8xKwHg==",
1668 | "requires": {
1669 | "@babel/runtime": "^7.3.1",
1670 | "jss": "10.7.1",
1671 | "tiny-warning": "^1.0.2"
1672 | }
1673 | },
1674 | "jss-plugin-vendor-prefixer": {
1675 | "version": "10.7.1",
1676 | "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.7.1.tgz",
1677 | "integrity": "sha512-1UHFmBn7hZNsHXTkLLOL8abRl8vi+D1EVzWD4WmLFj55vawHZfnH1oEz6TUf5Y61XHv0smdHabdXds6BgOXe3A==",
1678 | "requires": {
1679 | "@babel/runtime": "^7.3.1",
1680 | "css-vendor": "^2.0.8",
1681 | "jss": "10.7.1"
1682 | }
1683 | },
1684 | "kind-of": {
1685 | "version": "3.2.2",
1686 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1687 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1688 | "requires": {
1689 | "is-buffer": "^1.1.5"
1690 | }
1691 | },
1692 | "lazy-cache": {
1693 | "version": "1.0.4",
1694 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
1695 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
1696 | },
1697 | "lazy-debug-legacy": {
1698 | "version": "0.0.1",
1699 | "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz",
1700 | "integrity": "sha1-U3cWwHduTPeePtG2IfdljCkRsbE="
1701 | },
1702 | "levn": {
1703 | "version": "0.3.0",
1704 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1705 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1706 | "requires": {
1707 | "prelude-ls": "~1.1.2",
1708 | "type-check": "~0.3.2"
1709 | }
1710 | },
1711 | "lodash": {
1712 | "version": "4.17.21",
1713 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1714 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
1715 | },
1716 | "lodash._basecopy": {
1717 | "version": "3.0.1",
1718 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
1719 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY="
1720 | },
1721 | "lodash._basetostring": {
1722 | "version": "3.0.1",
1723 | "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
1724 | "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U="
1725 | },
1726 | "lodash._basevalues": {
1727 | "version": "3.0.0",
1728 | "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
1729 | "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc="
1730 | },
1731 | "lodash._getnative": {
1732 | "version": "3.9.1",
1733 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
1734 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
1735 | },
1736 | "lodash._isiterateecall": {
1737 | "version": "3.0.9",
1738 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
1739 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw="
1740 | },
1741 | "lodash._reescape": {
1742 | "version": "3.0.0",
1743 | "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
1744 | "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo="
1745 | },
1746 | "lodash._reevaluate": {
1747 | "version": "3.0.0",
1748 | "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
1749 | "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0="
1750 | },
1751 | "lodash._reinterpolate": {
1752 | "version": "3.0.0",
1753 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
1754 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
1755 | },
1756 | "lodash._root": {
1757 | "version": "3.0.1",
1758 | "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
1759 | "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
1760 | },
1761 | "lodash.escape": {
1762 | "version": "3.2.0",
1763 | "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
1764 | "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
1765 | "requires": {
1766 | "lodash._root": "^3.0.0"
1767 | }
1768 | },
1769 | "lodash.isarguments": {
1770 | "version": "3.1.0",
1771 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
1772 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
1773 | },
1774 | "lodash.isarray": {
1775 | "version": "3.0.4",
1776 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
1777 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
1778 | },
1779 | "lodash.keys": {
1780 | "version": "3.1.2",
1781 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
1782 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
1783 | "requires": {
1784 | "lodash._getnative": "^3.0.0",
1785 | "lodash.isarguments": "^3.0.0",
1786 | "lodash.isarray": "^3.0.0"
1787 | }
1788 | },
1789 | "lodash.restparam": {
1790 | "version": "3.6.1",
1791 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
1792 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU="
1793 | },
1794 | "lodash.template": {
1795 | "version": "3.6.2",
1796 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
1797 | "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
1798 | "requires": {
1799 | "lodash._basecopy": "^3.0.0",
1800 | "lodash._basetostring": "^3.0.0",
1801 | "lodash._basevalues": "^3.0.0",
1802 | "lodash._isiterateecall": "^3.0.0",
1803 | "lodash._reinterpolate": "^3.0.0",
1804 | "lodash.escape": "^3.0.0",
1805 | "lodash.keys": "^3.0.0",
1806 | "lodash.restparam": "^3.0.0",
1807 | "lodash.templatesettings": "^3.0.0"
1808 | }
1809 | },
1810 | "lodash.templatesettings": {
1811 | "version": "3.1.1",
1812 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
1813 | "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
1814 | "requires": {
1815 | "lodash._reinterpolate": "^3.0.0",
1816 | "lodash.escape": "^3.0.0"
1817 | }
1818 | },
1819 | "longest": {
1820 | "version": "1.0.1",
1821 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
1822 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
1823 | },
1824 | "loose-envify": {
1825 | "version": "1.4.0",
1826 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1827 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1828 | "requires": {
1829 | "js-tokens": "^3.0.0 || ^4.0.0"
1830 | }
1831 | },
1832 | "mime-db": {
1833 | "version": "1.48.0",
1834 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
1835 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ=="
1836 | },
1837 | "mime-types": {
1838 | "version": "2.1.31",
1839 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
1840 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
1841 | "requires": {
1842 | "mime-db": "1.48.0"
1843 | }
1844 | },
1845 | "minimatch": {
1846 | "version": "3.0.4",
1847 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1848 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1849 | "requires": {
1850 | "brace-expansion": "^1.1.7"
1851 | }
1852 | },
1853 | "minimist": {
1854 | "version": "1.2.5",
1855 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1856 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1857 | },
1858 | "mkdirp": {
1859 | "version": "0.5.5",
1860 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1861 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1862 | "requires": {
1863 | "minimist": "^1.2.5"
1864 | }
1865 | },
1866 | "ms": {
1867 | "version": "2.1.2",
1868 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1869 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1870 | },
1871 | "multipipe": {
1872 | "version": "0.1.2",
1873 | "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
1874 | "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
1875 | "requires": {
1876 | "duplexer2": "0.0.2"
1877 | }
1878 | },
1879 | "mute-stream": {
1880 | "version": "0.0.5",
1881 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
1882 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA="
1883 | },
1884 | "negotiator": {
1885 | "version": "0.6.2",
1886 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1887 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1888 | },
1889 | "next-tick": {
1890 | "version": "1.0.0",
1891 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
1892 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
1893 | },
1894 | "normalize-path": {
1895 | "version": "2.1.1",
1896 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
1897 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
1898 | "requires": {
1899 | "remove-trailing-separator": "^1.0.1"
1900 | }
1901 | },
1902 | "number-is-nan": {
1903 | "version": "1.0.1",
1904 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1905 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1906 | },
1907 | "object-assign": {
1908 | "version": "4.1.1",
1909 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1910 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1911 | },
1912 | "once": {
1913 | "version": "1.4.0",
1914 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1915 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1916 | "requires": {
1917 | "wrappy": "1"
1918 | }
1919 | },
1920 | "onetime": {
1921 | "version": "1.1.0",
1922 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
1923 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
1924 | },
1925 | "optionator": {
1926 | "version": "0.8.3",
1927 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
1928 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
1929 | "requires": {
1930 | "deep-is": "~0.1.3",
1931 | "fast-levenshtein": "~2.0.6",
1932 | "levn": "~0.3.0",
1933 | "prelude-ls": "~1.1.2",
1934 | "type-check": "~0.3.2",
1935 | "word-wrap": "~1.2.3"
1936 | }
1937 | },
1938 | "os-homedir": {
1939 | "version": "1.0.2",
1940 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1941 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
1942 | },
1943 | "os-tmpdir": {
1944 | "version": "1.0.2",
1945 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1946 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
1947 | },
1948 | "parse-node-version": {
1949 | "version": "1.0.1",
1950 | "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
1951 | "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA=="
1952 | },
1953 | "parseqs": {
1954 | "version": "0.0.6",
1955 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
1956 | "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
1957 | },
1958 | "parseuri": {
1959 | "version": "0.0.6",
1960 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
1961 | "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
1962 | },
1963 | "path-is-absolute": {
1964 | "version": "1.0.1",
1965 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1966 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1967 | },
1968 | "path-is-inside": {
1969 | "version": "1.0.2",
1970 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1971 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
1972 | },
1973 | "plugin-error": {
1974 | "version": "1.0.1",
1975 | "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
1976 | "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
1977 | "requires": {
1978 | "ansi-colors": "^1.0.1",
1979 | "arr-diff": "^4.0.0",
1980 | "arr-union": "^3.1.0",
1981 | "extend-shallow": "^3.0.2"
1982 | }
1983 | },
1984 | "pluralize": {
1985 | "version": "1.2.1",
1986 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
1987 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU="
1988 | },
1989 | "popper.js": {
1990 | "version": "1.16.1-lts",
1991 | "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz",
1992 | "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA=="
1993 | },
1994 | "prelude-ls": {
1995 | "version": "1.1.2",
1996 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1997 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
1998 | },
1999 | "pretty-bytes": {
2000 | "version": "3.0.1",
2001 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
2002 | "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
2003 | "requires": {
2004 | "number-is-nan": "^1.0.0"
2005 | }
2006 | },
2007 | "private": {
2008 | "version": "0.1.8",
2009 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
2010 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
2011 | },
2012 | "process-nextick-args": {
2013 | "version": "2.0.1",
2014 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2015 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
2016 | },
2017 | "progress": {
2018 | "version": "1.1.8",
2019 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
2020 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74="
2021 | },
2022 | "prop-types": {
2023 | "version": "15.7.2",
2024 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
2025 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
2026 | "requires": {
2027 | "loose-envify": "^1.4.0",
2028 | "object-assign": "^4.1.1",
2029 | "react-is": "^16.8.1"
2030 | },
2031 | "dependencies": {
2032 | "react-is": {
2033 | "version": "16.13.1",
2034 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2035 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
2036 | }
2037 | }
2038 | },
2039 | "react": {
2040 | "version": "17.0.2",
2041 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
2042 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
2043 | "requires": {
2044 | "loose-envify": "^1.1.0",
2045 | "object-assign": "^4.1.1"
2046 | }
2047 | },
2048 | "react-chartjs-2": {
2049 | "version": "3.0.3",
2050 | "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-3.0.3.tgz",
2051 | "integrity": "sha512-jOFZKwZ8sMLkddewZ/tToxuu4pYimAvvY5I6uK+hCpSFT16Pvo2bdHhUoZ0X87zu9I+dx2I+JCqaLN6XhmrbDg==",
2052 | "requires": {
2053 | "lodash": "^4.17.19"
2054 | }
2055 | },
2056 | "react-is": {
2057 | "version": "17.0.2",
2058 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
2059 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
2060 | },
2061 | "react-transition-group": {
2062 | "version": "4.4.2",
2063 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz",
2064 | "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==",
2065 | "requires": {
2066 | "@babel/runtime": "^7.5.5",
2067 | "dom-helpers": "^5.0.1",
2068 | "loose-envify": "^1.4.0",
2069 | "prop-types": "^15.6.2"
2070 | }
2071 | },
2072 | "readable-stream": {
2073 | "version": "2.3.7",
2074 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
2075 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
2076 | "requires": {
2077 | "core-util-is": "~1.0.0",
2078 | "inherits": "~2.0.3",
2079 | "isarray": "~1.0.0",
2080 | "process-nextick-args": "~2.0.0",
2081 | "safe-buffer": "~5.1.1",
2082 | "string_decoder": "~1.1.1",
2083 | "util-deprecate": "~1.0.1"
2084 | }
2085 | },
2086 | "readline2": {
2087 | "version": "1.0.1",
2088 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
2089 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=",
2090 | "requires": {
2091 | "code-point-at": "^1.0.0",
2092 | "is-fullwidth-code-point": "^1.0.0",
2093 | "mute-stream": "0.0.5"
2094 | }
2095 | },
2096 | "regenerator-runtime": {
2097 | "version": "0.13.7",
2098 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
2099 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
2100 | },
2101 | "remove-trailing-separator": {
2102 | "version": "1.1.0",
2103 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
2104 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
2105 | },
2106 | "repeat-string": {
2107 | "version": "1.6.1",
2108 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
2109 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
2110 | },
2111 | "repeating": {
2112 | "version": "2.0.1",
2113 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
2114 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
2115 | "requires": {
2116 | "is-finite": "^1.0.0"
2117 | }
2118 | },
2119 | "replace-ext": {
2120 | "version": "0.0.1",
2121 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
2122 | "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
2123 | },
2124 | "require-uncached": {
2125 | "version": "1.0.3",
2126 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
2127 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
2128 | "requires": {
2129 | "caller-path": "^0.1.0",
2130 | "resolve-from": "^1.0.0"
2131 | }
2132 | },
2133 | "resolve-from": {
2134 | "version": "1.0.1",
2135 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
2136 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
2137 | },
2138 | "resolve-url": {
2139 | "version": "0.2.1",
2140 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
2141 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
2142 | },
2143 | "restore-cursor": {
2144 | "version": "1.0.1",
2145 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
2146 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
2147 | "requires": {
2148 | "exit-hook": "^1.0.0",
2149 | "onetime": "^1.0.0"
2150 | }
2151 | },
2152 | "right-align": {
2153 | "version": "0.1.3",
2154 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
2155 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
2156 | "requires": {
2157 | "align-text": "^0.1.1"
2158 | }
2159 | },
2160 | "rimraf": {
2161 | "version": "2.6.3",
2162 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
2163 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
2164 | "requires": {
2165 | "glob": "^7.1.3"
2166 | }
2167 | },
2168 | "run-async": {
2169 | "version": "0.1.0",
2170 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
2171 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=",
2172 | "requires": {
2173 | "once": "^1.3.0"
2174 | }
2175 | },
2176 | "rx-lite": {
2177 | "version": "3.1.2",
2178 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
2179 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI="
2180 | },
2181 | "safe-buffer": {
2182 | "version": "5.1.2",
2183 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2184 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
2185 | },
2186 | "shelljs": {
2187 | "version": "0.6.1",
2188 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz",
2189 | "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg="
2190 | },
2191 | "slash": {
2192 | "version": "1.0.0",
2193 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
2194 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
2195 | },
2196 | "slice-ansi": {
2197 | "version": "0.0.4",
2198 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
2199 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU="
2200 | },
2201 | "socket.io": {
2202 | "version": "4.1.3",
2203 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.3.tgz",
2204 | "integrity": "sha512-tLkaY13RcO4nIRh1K2hT5iuotfTaIQw7cVIe0FUykN3SuQi0cm7ALxuyT5/CtDswOMWUzMGTibxYNx/gU7In+Q==",
2205 | "requires": {
2206 | "@types/cookie": "^0.4.0",
2207 | "@types/cors": "^2.8.10",
2208 | "@types/node": ">=10.0.0",
2209 | "accepts": "~1.3.4",
2210 | "base64id": "~2.0.0",
2211 | "debug": "~4.3.1",
2212 | "engine.io": "~5.1.1",
2213 | "socket.io-adapter": "~2.3.1",
2214 | "socket.io-parser": "~4.0.4"
2215 | }
2216 | },
2217 | "socket.io-adapter": {
2218 | "version": "2.3.1",
2219 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz",
2220 | "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw=="
2221 | },
2222 | "socket.io-client": {
2223 | "version": "4.1.3",
2224 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.3.tgz",
2225 | "integrity": "sha512-hISFn6PDpgDifVUiNklLHVPTMv1LAk8poHArfIUdXa+gKgbr0MZbAlquDFqCqsF30yBqa+jg42wgos2FK50BHA==",
2226 | "requires": {
2227 | "@types/component-emitter": "^1.2.10",
2228 | "backo2": "~1.0.2",
2229 | "component-emitter": "~1.3.0",
2230 | "debug": "~4.3.1",
2231 | "engine.io-client": "~5.1.2",
2232 | "parseuri": "0.0.6",
2233 | "socket.io-parser": "~4.0.4"
2234 | }
2235 | },
2236 | "socket.io-parser": {
2237 | "version": "4.0.4",
2238 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
2239 | "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
2240 | "requires": {
2241 | "@types/component-emitter": "^1.2.10",
2242 | "component-emitter": "~1.3.0",
2243 | "debug": "~4.3.1"
2244 | }
2245 | },
2246 | "source-map": {
2247 | "version": "0.5.7",
2248 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2249 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
2250 | },
2251 | "source-map-resolve": {
2252 | "version": "0.5.3",
2253 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
2254 | "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
2255 | "requires": {
2256 | "atob": "^2.1.2",
2257 | "decode-uri-component": "^0.2.0",
2258 | "resolve-url": "^0.2.1",
2259 | "source-map-url": "^0.4.0",
2260 | "urix": "^0.1.0"
2261 | }
2262 | },
2263 | "source-map-support": {
2264 | "version": "0.4.18",
2265 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
2266 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
2267 | "requires": {
2268 | "source-map": "^0.5.6"
2269 | }
2270 | },
2271 | "source-map-url": {
2272 | "version": "0.4.1",
2273 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
2274 | "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
2275 | },
2276 | "sparkles": {
2277 | "version": "1.0.1",
2278 | "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
2279 | "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw=="
2280 | },
2281 | "sprintf-js": {
2282 | "version": "1.0.3",
2283 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2284 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
2285 | },
2286 | "stream-counter": {
2287 | "version": "1.0.0",
2288 | "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz",
2289 | "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E="
2290 | },
2291 | "string-width": {
2292 | "version": "1.0.2",
2293 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
2294 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
2295 | "requires": {
2296 | "code-point-at": "^1.0.0",
2297 | "is-fullwidth-code-point": "^1.0.0",
2298 | "strip-ansi": "^3.0.0"
2299 | }
2300 | },
2301 | "string_decoder": {
2302 | "version": "1.1.1",
2303 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2304 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2305 | "requires": {
2306 | "safe-buffer": "~5.1.0"
2307 | }
2308 | },
2309 | "strip-ansi": {
2310 | "version": "3.0.1",
2311 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2312 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2313 | "requires": {
2314 | "ansi-regex": "^2.0.0"
2315 | }
2316 | },
2317 | "strip-bom": {
2318 | "version": "2.0.0",
2319 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
2320 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
2321 | "requires": {
2322 | "is-utf8": "^0.2.0"
2323 | }
2324 | },
2325 | "strip-json-comments": {
2326 | "version": "1.0.4",
2327 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
2328 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
2329 | },
2330 | "supports-color": {
2331 | "version": "2.0.0",
2332 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
2333 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
2334 | },
2335 | "table": {
2336 | "version": "3.8.3",
2337 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
2338 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=",
2339 | "requires": {
2340 | "ajv": "^4.7.0",
2341 | "ajv-keywords": "^1.0.0",
2342 | "chalk": "^1.1.1",
2343 | "lodash": "^4.0.0",
2344 | "slice-ansi": "0.0.4",
2345 | "string-width": "^2.0.0"
2346 | },
2347 | "dependencies": {
2348 | "ansi-regex": {
2349 | "version": "3.0.0",
2350 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2351 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
2352 | },
2353 | "is-fullwidth-code-point": {
2354 | "version": "2.0.0",
2355 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2356 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
2357 | },
2358 | "string-width": {
2359 | "version": "2.1.1",
2360 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2361 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2362 | "requires": {
2363 | "is-fullwidth-code-point": "^2.0.0",
2364 | "strip-ansi": "^4.0.0"
2365 | }
2366 | },
2367 | "strip-ansi": {
2368 | "version": "4.0.0",
2369 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2370 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2371 | "requires": {
2372 | "ansi-regex": "^3.0.0"
2373 | }
2374 | }
2375 | }
2376 | },
2377 | "text-table": {
2378 | "version": "0.2.0",
2379 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2380 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
2381 | },
2382 | "through": {
2383 | "version": "2.3.8",
2384 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2385 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
2386 | },
2387 | "through2": {
2388 | "version": "2.0.5",
2389 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
2390 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
2391 | "requires": {
2392 | "readable-stream": "~2.3.6",
2393 | "xtend": "~4.0.1"
2394 | }
2395 | },
2396 | "time-stamp": {
2397 | "version": "1.1.0",
2398 | "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
2399 | "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
2400 | },
2401 | "tiny-warning": {
2402 | "version": "1.0.3",
2403 | "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
2404 | "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
2405 | },
2406 | "to-fast-properties": {
2407 | "version": "1.0.3",
2408 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
2409 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
2410 | },
2411 | "trim-right": {
2412 | "version": "1.0.1",
2413 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
2414 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
2415 | },
2416 | "type": {
2417 | "version": "1.2.0",
2418 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
2419 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
2420 | },
2421 | "type-check": {
2422 | "version": "0.3.2",
2423 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
2424 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
2425 | "requires": {
2426 | "prelude-ls": "~1.1.2"
2427 | }
2428 | },
2429 | "typedarray": {
2430 | "version": "0.0.6",
2431 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2432 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
2433 | },
2434 | "uglify-js": {
2435 | "version": "2.6.4",
2436 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz",
2437 | "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=",
2438 | "requires": {
2439 | "async": "~0.2.6",
2440 | "source-map": "~0.5.1",
2441 | "uglify-to-browserify": "~1.0.0",
2442 | "yargs": "~3.10.0"
2443 | }
2444 | },
2445 | "uglify-save-license": {
2446 | "version": "0.4.1",
2447 | "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz",
2448 | "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE="
2449 | },
2450 | "uglify-to-browserify": {
2451 | "version": "1.0.2",
2452 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
2453 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc="
2454 | },
2455 | "urix": {
2456 | "version": "0.1.0",
2457 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
2458 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
2459 | },
2460 | "user-home": {
2461 | "version": "2.0.0",
2462 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
2463 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
2464 | "requires": {
2465 | "os-homedir": "^1.0.0"
2466 | }
2467 | },
2468 | "util-deprecate": {
2469 | "version": "1.0.2",
2470 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2471 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2472 | },
2473 | "vary": {
2474 | "version": "1.1.2",
2475 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2476 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2477 | },
2478 | "vinyl": {
2479 | "version": "1.2.0",
2480 | "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
2481 | "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
2482 | "requires": {
2483 | "clone": "^1.0.0",
2484 | "clone-stats": "^0.0.1",
2485 | "replace-ext": "0.0.1"
2486 | }
2487 | },
2488 | "vinyl-sourcemaps-apply": {
2489 | "version": "0.2.1",
2490 | "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
2491 | "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
2492 | "requires": {
2493 | "source-map": "^0.5.1"
2494 | }
2495 | },
2496 | "window-size": {
2497 | "version": "0.1.0",
2498 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
2499 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
2500 | },
2501 | "word-wrap": {
2502 | "version": "1.2.3",
2503 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
2504 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
2505 | },
2506 | "wordwrap": {
2507 | "version": "0.0.2",
2508 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
2509 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
2510 | },
2511 | "wrappy": {
2512 | "version": "1.0.2",
2513 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2514 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2515 | },
2516 | "write": {
2517 | "version": "0.2.1",
2518 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
2519 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
2520 | "requires": {
2521 | "mkdirp": "^0.5.1"
2522 | }
2523 | },
2524 | "ws": {
2525 | "version": "7.4.6",
2526 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
2527 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
2528 | },
2529 | "xtend": {
2530 | "version": "4.0.2",
2531 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2532 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
2533 | },
2534 | "yargs": {
2535 | "version": "3.10.0",
2536 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
2537 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
2538 | "requires": {
2539 | "camelcase": "^1.0.2",
2540 | "cliui": "^2.1.0",
2541 | "decamelize": "^1.0.0",
2542 | "window-size": "0.1.0"
2543 | }
2544 | },
2545 | "yeast": {
2546 | "version": "0.1.2",
2547 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
2548 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
2549 | }
2550 | }
2551 | }
2552 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "@material-ui/core": "^4.12.1",
4 | "chart.js": "^3.4.1",
5 | "cjs-loader": "^0.1.0",
6 | "EventEmitter": "^1.0.0",
7 | "react": "^17.0.2",
8 | "react-chartjs-2": "^3.0.3",
9 | "socket.io": "^4.1.3",
10 | "socket.io-client": "^4.1.3"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/react-app/.env:
--------------------------------------------------------------------------------
1 | NODE_ENV = dev
2 |
--------------------------------------------------------------------------------
/react-app/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/react-app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-app",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "build": "webpack",
9 | "dev": "concurrently \"webpack serve --open\" \"nodemon ./server/server.js\" \"node ./server/websocketKafkaNode.js\""
10 | },
11 | "keywords": [],
12 | "author": "",
13 | "license": "ISC",
14 | "dependencies": {
15 | "@types/react": "^17.0.11",
16 | "@types/react-dom": "^17.0.8",
17 | "chart.js": "^3.4.1",
18 | "chartjs-plugin-streaming": "^2.0.0",
19 | "concurrently": "^6.2.0",
20 | "cookie-parser": "^1.4.5",
21 | "express": "^4.17.1",
22 | "kafkajs": "^1.15.0",
23 | "nodemon": "^2.0.12",
24 | "react": "^17.0.2",
25 | "react-chartjs-2": "^3.0.3",
26 | "react-dom": "^17.0.2",
27 | "react-router-dom": "^5.2.0",
28 | "regenerator-runtime": "^0.13.7",
29 | "socket.io": "^4.1.3",
30 | "socket.io-client": "^4.1.3",
31 | "ts-node": "^10.1.0",
32 | "typescript": "^4.3.4",
33 | "util": "^0.12.4"
34 | },
35 | "devDependencies": {
36 | "css-loader": "^5.2.6",
37 | "dotenv-webpack": "^7.0.3",
38 | "html-webpack-plugin": "^5.3.2",
39 | "sass": "^1.35.1",
40 | "sass-loader": "^12.1.0",
41 | "style-loader": "^3.0.0",
42 | "ts-loader": "^9.2.3",
43 | "webpack": "^5.45.0",
44 | "webpack-cli": "^4.7.2",
45 | "webpack-dev-server": "^3.11.2"
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/react-app/server/controllers/connectController.js:
--------------------------------------------------------------------------------
1 | // const connectController = {};
2 | const { Kafka } = require('kafkajs');
3 |
4 | module.exports = {
5 |
6 | checkConnection : async (req, res, next) => {
7 | const { username, password, broker } = req.body;
8 |
9 | const sasl = username && password ? { username, password, mechanism: 'plain' } : null;
10 | const ssl = !!sasl;
11 |
12 | res.locals.connected = false;
13 |
14 | // console.log("In connect controller");
15 |
16 | try {
17 | const kafka = new Kafka({
18 | clientId: 'kafkaSentinel',
19 | brokers: [`${broker}`],
20 | ssl,
21 | sasl
22 | })
23 |
24 | const admin = kafka.admin()
25 | await admin.connect()
26 | await admin.listTopics()
27 | await admin.disconnect()
28 |
29 |
30 | }catch(err) {
31 | return next();
32 | }
33 |
34 | res.locals.connected = true;
35 | return next();
36 | }
37 | }
38 |
39 |
40 |
41 | // module.exports = connectController;
--------------------------------------------------------------------------------
/react-app/server/controllers/cookieController.js:
--------------------------------------------------------------------------------
1 | const cookieController = {};
2 |
3 | cookieController.createCookie = (req, res, next) => {
4 | const { username, password, broker } = req.body;
5 |
6 | if(res.locals.connected == true) {
7 | res.cookie('username', username);
8 | res.cookie('password', password);
9 | res.cookie('broker', broker);
10 | }
11 |
12 | next();
13 | }
14 |
15 | cookieController.checkCookie = (req,res,next) => {
16 | console.log("checkCookie time");
17 | const username = req.cookies.username;
18 | const password = req.cookies.password;
19 | const broker = req.cookies.broker;
20 |
21 | req.body.username = username;
22 | req.body.password = password;
23 | req.body.broker = broker;
24 |
25 | next();
26 | }
27 |
28 | module.exports = cookieController;
--------------------------------------------------------------------------------
/react-app/server/controllers/kafkaController.js:
--------------------------------------------------------------------------------
1 | const { Kafka } = require('kafkajs');
2 | const { io } = require ('socket.io-client');
3 |
4 | const kafkaController = {};
5 |
6 | kafkaController.getClusterInfo = async (req,res,next) => {
7 |
8 | console.log("in kafkaController");
9 |
10 | const username = req.cookies.username;
11 | const password = req.cookies.password;
12 | const broker = req.cookies.broker;
13 |
14 | const sasl = username && password ? { username, password, mechanism: 'plain' } : null
15 | const ssl = !!sasl
16 |
17 | const kafka = new Kafka({
18 | clientId: 'kafkaSentinelAdminInfo',
19 | brokers: [`${broker}`],
20 | ssl,
21 | sasl
22 | })
23 |
24 | const admin = kafka.admin()
25 | await admin.connect()
26 |
27 | const socket = io("http://localhost:5000");
28 | const describeCluster = await admin.describeCluster()
29 |
30 | // console.log("describe cluster", describeCluster);
31 |
32 | // grab cluster name
33 | const clusterId = describeCluster.clusterId;
34 | await socket.emit("clusterId", clusterId);
35 |
36 | // grab number of brokers
37 | const numOfBrokers = describeCluster.brokers.length;
38 | await socket.emit("numOfBrokers", numOfBrokers);
39 |
40 | const topicList = await admin.listTopics();
41 |
42 | // console.log(topicList);
43 |
44 | const topicMetaData = await admin.fetchTopicMetadata({ topics: topicList })
45 |
46 | // console.log("topic MetaData", topicMetaData)
47 |
48 | // create object that will hold key:value pairs of topicName:NumOfPartitions
49 | const topicListInfoObj = {}
50 |
51 | // store total number of topics
52 | let numOfTopics = 0;
53 |
54 | // store total number of partitions
55 | let totalPartitions = 0;
56 |
57 | await topicMetaData.topics.forEach((el,index) => {
58 | topicListInfoObj[el.name] = topicMetaData.topics[index].partitions.length;
59 | numOfTopics++;
60 | totalPartitions += topicListInfoObj[el.name]
61 | // console.log(`Total number of partitions for ${el.name}: ${topicMetaData.topics[index].partitions.length}`)
62 | })
63 |
64 | // emit object with topicName:topicPartitionQuantity key:value pairs
65 | await socket.emit("topicListInfoObj", topicListInfoObj);
66 | // emit total number of topics
67 | await socket.emit("numOfTopics", numOfTopics);
68 | // emit total number of partitions
69 | await socket.emit("totalPartitions", totalPartitions);
70 |
71 | await admin.disconnect();
72 |
73 | next();
74 | }
75 |
76 | let hit = false;
77 |
78 | kafkaController.startConsumers = async (req, res, next) => {
79 | if(hit) return next();
80 | hit = true;
81 | const socket = io("http://localhost:5000");
82 |
83 | const username = req.cookies.username;
84 | const password = req.cookies.password;
85 | const broker = req.cookies.broker;
86 |
87 | const sasl = username && password ? { username, password, mechanism: 'plain' } : null
88 | const ssl = !!sasl
89 |
90 | const kafka = new Kafka({
91 | clientId: 'kafkaSentinelAdminInfo',
92 | brokers: [`${broker}`],
93 | ssl,
94 | sasl
95 | })
96 |
97 | // // Start consumer
98 | const consumer = kafka.consumer({ groupId: 'kafka-sentinel-group' });
99 | const producer = kafka.producer();
100 | // // Connect to Kafka instance
101 | await consumer.connect()
102 | await producer.connect()
103 |
104 | await consumer.subscribe({ topic: 'npm-package-published', fromBeginning: true })
105 | // await consumer.subscribe({ topic: 'testing', fromBeginning: true })
106 |
107 | const idLocker = {};
108 | let bytesTotalConsumer = 0;
109 | let totalMessagesConsumed = 0;
110 | const messagesConsumed = [];
111 | const { REQUEST } = consumer.events;
112 | const consumerEvent = async () => await consumer.on(REQUEST, async (e) => {
113 | if(!idLocker[e.id]){
114 | idLocker[e.id] = true;
115 | bytesTotalConsumer += e.payload.size
116 | }
117 | // await console.log("Line 48 REQUEST", e.id)
118 | // await consumerEvent();
119 | })
120 | consumerEvent();
121 |
122 |
123 | await consumer.run({
124 | eachMessage: async ({ topic, partition, message }) => {
125 | console.log("another message")
126 |
127 | console.log("consumer total bytes", bytesTotalConsumer)
128 |
129 | // emit total bytes consumed by consumer
130 | await socket.emit("bytesTotalConsumer", bytesTotalConsumer);
131 |
132 | messagesConsumed.push("message");
133 | // increment total messages consumed
134 | totalMessagesConsumed += 1;
135 | console.log("total msgs consumed", totalMessagesConsumed, "messagesConsumed", messagesConsumed);
136 | // emit total messages consumed
137 | await socket.emit("totalMessagesConsumed", totalMessagesConsumed);
138 |
139 | },
140 | })
141 |
142 | return next();
143 | }
144 |
145 |
146 | module.exports = kafkaController;
--------------------------------------------------------------------------------
/react-app/server/producer.js:
--------------------------------------------------------------------------------
1 | const { Kafka } = require('kafkajs');
2 |
3 | // 1.Instantiating kafka
4 |
5 | const username = 'SJ335XIPE5Q5ZPYS'
6 | const password = 'r4kpR3eQXiEEsH6CVvTfILuDaO3MIDRPgiXSM9fWLd3dVqmWDT4qafdCc9W9aKbF'
7 |
8 |
9 | const sasl = username && password ? { username, password, mechanism: 'plain' } : null
10 | const ssl = !!sasl
11 |
12 | const config = {
13 | clientId: 'npm-slack-notifier',
14 | brokers: ['pkc-ep9mm.us-east-2.aws.confluent.cloud:9092'],
15 | kafka_topic: 'npm-package-published',
16 | ssl,
17 | sasl,
18 | connectionTimeout: 3000,
19 | authenticationTimeout: 1000,
20 | reauthenticationThreshold: 10000,
21 | };
22 |
23 | // console.log('Line 31');
24 | const kafka = new Kafka(config);
25 | // 2.Creating Kafka Producer
26 | const producer = kafka.producer();
27 | const runProducer = async () => {
28 |
29 | const message = { hot : "dog"};
30 | // 3.Connecting producer to kafka broker.
31 | console.log("Connecting...")
32 | await producer.connect()
33 | console.log("Connected!")
34 |
35 | function waitforme(milisec) {
36 | return new Promise(resolve => {
37 | setTimeout(() => { resolve('') }, milisec);
38 | })
39 | }
40 |
41 | const { io } = require ('socket.io-client');
42 | const socket = io("http://localhost:5000");
43 |
44 | let totalProducerMessages = 0;
45 | let producedMessagesTotalSize = 0;
46 |
47 | async function dummyProducer() {
48 | for (let i = 0; i < 15; ++i) {
49 |
50 | // const { REQUEST } = producer.events;
51 | // const prod = await producer.on(REQUEST, async (e) => {
52 |
53 | // await console.log("Line 94 event", e);
54 | // // increment total messages
55 | // totalProducerMessages += 1;
56 | // // increase aggregate size of messages by message size
57 | // producedMessagesTotalSize += e.payload.size;
58 | // console.log(`prodMSGs: ${producedMessagesTotalSize}`);
59 |
60 | // prod();
61 |
62 | // await console.log("aggregate message size", producedMessagesTotalSize);
63 | // await console.log("total producer messages:", totalProducerMessages)
64 |
65 | // //emit current number of producer messages produced
66 | // await socket.emit("totalProducerMessages", totalProducerMessages);
67 |
68 | // // emit total size of produced messages
69 | // await socket.emit("producedMessagesTotalSize", producedMessagesTotalSize);
70 |
71 | // })
72 |
73 | await waitforme(3000);
74 | await console.log(i);
75 | await producer.send({
76 | topic: 'npm-package-published',
77 | messages:
78 | [{ value: JSON.stringify(message) }],
79 | })
80 | }
81 | console.log("Loop execution finished!");
82 | }
83 |
84 | dummyProducer();
85 | }
86 |
87 | runProducer();
--------------------------------------------------------------------------------
/react-app/server/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const cookieParser = require('cookie-parser');
3 | const connectController = require('./controllers/connectController');
4 | const cookieController = require('./controllers/cookieController');
5 | const kafkaController = require('./controllers/kafkaController');
6 | const bodyParser = require('body-parser');
7 |
8 |
9 | const PORT = 3000;
10 | const app = express();
11 |
12 |
13 | app.use(express.json());
14 | app.use(cookieParser());
15 | app.use(express.urlencoded({ extended: true }));
16 |
17 |
18 | app.post('/connectKafka', connectController.checkConnection, cookieController.createCookie, (req, res, next) => {
19 | try {
20 | res.status(200).json({ connected: res.locals.connected });
21 | } catch (error) {
22 | next(error);
23 | }
24 | });
25 |
26 |
27 | app.use('/checkCookie', cookieController.checkCookie, connectController.checkConnection, (req, res, next) => {
28 | try {
29 | return res.status(200).json({ connected: res.locals.connected });
30 | } catch (error) {
31 | return next(error);
32 | }
33 | });
34 |
35 | app.use('/getClusterInfo', kafkaController.getClusterInfo, kafkaController.startConsumers, (req, res, next) => {
36 | try {
37 | return res.status(200).json({ connected: true });
38 | } catch (error) {
39 | return next(error);
40 | }
41 | });
42 |
43 |
44 | app.get('/', (req, res, next) => {
45 | res.status(404).json({ message: 'nothing here' });
46 | });
47 |
48 |
49 | app.use((err, req, res, next) => {
50 | const defaultErr = {
51 | log: 'Express error handler caught unknown middleware error',
52 | status: 400,
53 | message: { err: 'An error occurred' },
54 | };
55 | const errorObj = { ...defaultErr, ...err };
56 | console.log(errorObj.log);
57 | return res.status(errorObj.status).json(errorObj.message);
58 | });
59 |
60 |
61 |
62 | app.listen(PORT, () => {
63 | console.log('server started');
64 | });
65 |
66 | module.exports = app;
--------------------------------------------------------------------------------
/react-app/server/websocketKafkaNode.js:
--------------------------------------------------------------------------------
1 | const ioSocket = require('socket.io')(5000, {
2 | cors: {
3 | origin: '*',
4 | credentials: true
5 | }
6 | });
7 |
8 | ioSocket.on('connection', socket => {
9 |
10 |
11 |
12 | // consumer sent info
13 |
14 | // send name of cluster from confluent
15 | socket.on("clusterId", data => {
16 | // data = JSON.parse(data);
17 | console.log("clusterId", data);
18 | ioSocket.emit("clusterId", data);
19 | });
20 |
21 | // send total number of brokers in cluster
22 | socket.on("numOfBrokers", data => {
23 | // data = JSON.parse(data);
24 | console.log("numOfBrokers", data);
25 | ioSocket.emit("numOfBrokers", data);
26 | });
27 |
28 | // sending object with topicName:NumOfPartitions key:value pairs
29 | socket.on("topicListInfoObj", data => {
30 | // data = JSON.parse(data);
31 | console.log("topicListInfoObj", data);
32 | ioSocket.emit("topicListInfoObj", data);
33 | });
34 |
35 | socket.on("numOfTopics", data => {
36 | // data = JSON.parse(data);
37 | console.log("numOfTopics", data);
38 | ioSocket.emit("numOfTopics", data);
39 | });
40 |
41 | socket.on("totalPartitions", data => {
42 | // data = JSON.parse(data);
43 | console.log("totalPartitions", data);
44 | ioSocket.emit("totalPartitions", data);
45 | });
46 |
47 | socket.on("bytesTotalConsumer", data => {
48 | // data = JSON.parse(data);
49 | console.log("bytesTotalConsumer", data);
50 | ioSocket.emit("bytesTotalConsumer", data);
51 | });
52 |
53 | socket.on("totalMessagesConsumed", data => {
54 | // data = JSON.parse(data);
55 | console.log("totalMessagesConsumed", data);
56 | ioSocket.emit("totalMessagesConsumed", data);
57 | });
58 |
59 |
60 | // producer sent info
61 |
62 | socket.on("totalProducerMessages", data => {
63 | // data = JSON.parse(data);
64 | console.log("totalProducerMessages", data);
65 | ioSocket.emit("totalProducerMessages", data);
66 | });
67 |
68 | socket.on("producedMessagesTotalSize", data => {
69 | // data = JSON.parse(data);
70 | console.log("producedMessagesTotalSize", data);
71 | ioSocket.emit("producedMessagesTotalSize", data);
72 | });
73 | });
74 |
--------------------------------------------------------------------------------
/react-app/src/app.scss:
--------------------------------------------------------------------------------
1 | .app {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 |
6 | & > h1 {
7 | font-style: italic;
8 | }
9 | }
10 |
11 | // .LineChart {
12 | // width: 3rem;
13 | // }
14 |
15 |
--------------------------------------------------------------------------------
/react-app/src/app.tsx:
--------------------------------------------------------------------------------
1 | import React, { FC, useState, useEffect } from 'react';
2 | import MainContainer from './containers/MainContainer'
3 | import { BrowserRouter as Router, Route, Switch, Link, Redirect } from "react-router-dom";
4 | import Connect from './containers/Connect'
5 | // import './app.scss';
6 |
7 | const App = props => {
8 | const [connected, setConnected] = useState(false);
9 | const connectedHandler = () => {
10 | setConnected(true);
11 | }
12 |
13 | useEffect(() => {
14 | console.log("in useEffect line 14 of app.tsx")
15 | // fetch request to cookie controller to check current cookie values
16 | fetch('/checkCookie')
17 | .then(response => response.json())
18 | .then(data => {
19 | // console.log("hello")
20 | if(data.connected === true){
21 | connectedHandler();
22 | }
23 | })
24 | .catch((err) => {
25 | console.log(err);
26 | })
27 | })
28 |
29 | if(connected == true) {
30 | console.log("hello from line 29 in app.tsx")
31 | // const ioSocket = require('socket.io')(5000, {
32 | // cors: {
33 | // origin: '*',
34 | // // origin: ['http://localhost:5000'],
35 | // credentials: true
36 | // }
37 | // });
38 |
39 | // ioSocket.on('connection', socket => {
40 | // console.log(socket.id)
41 |
42 | // socket.on("disconnect", () => {
43 | // console.log(`Client ${socket.id} disconnected`);
44 | // });
45 | // });
46 |
47 | fetch('/checkCookie')
48 | .then(response => response.json())
49 | .then(data => {
50 | // console.log("hello")
51 | if(data.connected === true){
52 | connectedHandler();
53 | }
54 | })
55 | .catch((err) => {
56 | console.log(err);
57 | })
58 |
59 |
60 | }
61 |
62 | return(
63 |
64 | {connected ? : }
65 |
66 | }/>
67 |
68 |
69 |
70 |
71 | )
72 | }
73 |
74 |
75 |
76 | // const App = props => {
77 |
78 | // return(
79 | //
80 | //
81 | //
82 | // )
83 | // }
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | // interface AppProps {
96 | // initialCount?: number;
97 | // }
98 |
99 | // interface AppState {
100 | // counter: number;
101 | // }
102 |
103 | // export class App extends React.Component {
104 | // constructor(props: AppProps) {
105 | // super(props);
106 |
107 | // this.state = {
108 | // counter: props.initialCount || 0,
109 | // };
110 |
111 | // this.increment = this.increment.bind(this);
112 | // }
113 |
114 | // increment() {
115 | // this.setState((prevState) => ({
116 | // ...prevState,
117 | // counter: prevState.counter + 1,
118 | // }));
119 | // }
120 |
121 | // render() {
122 | // return (
123 | //
124 | //
My App
125 | //
{`Initial count: ${this.props.initialCount || 0}`}
126 | //
129 | //
130 | // );
131 | // }
132 | // }
133 |
134 | // export const App: FC = ({ initialCount }) => {
135 | // const [counter, setCounter] = useState(initialCount || 0);
136 |
137 | // return (
138 | //
139 | //
My App
140 | //
{`Initial count: ${initialCount || 0}`}
141 | //
144 | //
145 | // );
146 | // };
147 | export default App;
--------------------------------------------------------------------------------
/react-app/src/assets/KafkaSentinelDarkerLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/KafkaSentinel/8a97693adf5353939f47ce8fcfac3488293a463d/react-app/src/assets/KafkaSentinelDarkerLogo.png
--------------------------------------------------------------------------------
/react-app/src/assets/KafkaSentinelLogo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/oslabs-beta/KafkaSentinel/8a97693adf5353939f47ce8fcfac3488293a463d/react-app/src/assets/KafkaSentinelLogo.jpg
--------------------------------------------------------------------------------
/react-app/src/components/LineChart.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from "react";
2 |
3 | import { Line } from "react-chartjs-2";
4 | const { io } = require ('socket.io-client');
5 |
6 | const socket = io("http://localhost:5000");
7 |
8 | const LineChart = props => {
9 |
10 | const [totalProducerMessages, setTotalProducerMessages] = useState(0);
11 | const [producedMessagesTotalSize, setProducedMessagesTotalSize] = useState(0);
12 | console.log("lineChart body");
13 |
14 | const [bytesTotalConsumer, setBytesTotalConsumer] = useState(0);
15 |
16 |
17 | const [data, setData] = useState({
18 | labels: [],
19 | datasets: [
20 | {
21 | label: "Total Size of Consumed Messages",
22 | data: [],
23 | fill: true,
24 | backgroundColor: "rgba(75,192,192,0.2)",
25 | borderColor: "rgba(75,192,192,1)"
26 | },
27 | ]
28 | });
29 |
30 | useEffect(() => {
31 | socket.on("bytesTotalConsumer", consumerData => {
32 |
33 | console.log("hello from line 358", consumerData);
34 |
35 | setBytesTotalConsumer(consumerData);
36 |
37 | let today = new Date();
38 | let time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
39 |
40 | let newData = JSON.parse(JSON.stringify(data));
41 |
42 | console.log('newData', newData);
43 |
44 | newData.labels.push(time);
45 | newData.datasets[0].data.push(bytesTotalConsumer);
46 |
47 | setData(newData);
48 | });
49 |
50 | })
51 |
52 |
53 |
54 | return(
55 |
56 |
57 |
58 | )
59 | }
60 |
61 | export default LineChart;
--------------------------------------------------------------------------------
/react-app/src/components/metricGraph.tsx:
--------------------------------------------------------------------------------
1 | import React, { FC, useState, useEffect, Component } from 'react';
2 |
3 | const MetricGraph = props => {
4 |
5 | return(
6 | //single metric graph component
7 |
8 | {props.str}: {props.metric}
9 |
10 | )
11 | }
12 |
13 | export default MetricGraph;
--------------------------------------------------------------------------------
/react-app/src/containers/Connect.tsx:
--------------------------------------------------------------------------------
1 | import React, { FC, useState, useEffect } from 'react'
2 | import { useHistory } from "react-router-dom";
3 | import regeneratorRuntime from "regenerator-runtime";
4 |
5 |
6 | const Connect = props => {
7 |
8 | let history = useHistory();
9 |
10 | const connectHandler = (event) => {
11 | event.preventDefault();
12 |
13 | const username = document.getElementById('userName');
14 | const password = document.getElementById('userPassword');
15 | const broker = document.getElementById('broker');
16 |
17 |
18 | fetch('/connectKafka', {
19 | method: 'POST',
20 | headers: {'Accept': 'application/json, text/plain, */*',
21 | 'Content-Type': 'application/json'},
22 | body: JSON.stringify({'username': username.value, 'password': password.value, 'broker': broker.value}),
23 | })
24 | .then(response => response.json())
25 | .then(data => {
26 | if(data.connected === true){
27 | props.connectedHandler();
28 | history.push('/');
29 | }
30 | })
31 | .catch((err) => {
32 | console.log(err);
33 | })
34 | return;
35 | }
36 |
37 |
38 | return (
39 |
40 |
41 |

42 |
43 |
64 |
65 |
66 | )
67 |
68 | }
69 |
70 |
71 |
72 | export default Connect;
--------------------------------------------------------------------------------
/react-app/src/containers/MainContainer.tsx:
--------------------------------------------------------------------------------
1 | import React, { FC, useState, useEffect } from 'react';
2 | import Metrics from './Metrics'
3 | // const image = require( "../assets/KafkaSentinelLogo.jpg")
4 |
5 | const MainContainer = props => {
6 |
7 | useEffect(() => {
8 | fetch('/getClusterInfo')
9 | .then(response => response.json())
10 | .then(data => {
11 | console.log("completed cluster fetch request. from line 12 on mainContainer", data);
12 | })
13 | .catch((err) => {
14 | console.log(err);
15 | })
16 | }, [])
17 |
18 |
19 |
20 | return(
21 |
22 |
23 |
24 |

25 |
26 | {/*
KafkaSentinel
*/}
27 |
Metrics
28 |
29 |
30 |
31 | )
32 | }
33 |
34 | export default MainContainer;
--------------------------------------------------------------------------------
/react-app/src/containers/Metrics.tsx:
--------------------------------------------------------------------------------
1 | import React, { FC, useState, useEffect } from 'react'
2 | import MetricGraph from '../components/metricGraph'
3 | const { io } = require ('socket.io-client');
4 | import {Line} from 'react-chartjs-2';
5 | import LineChart from '../components/LineChart'
6 |
7 |
8 |
9 | const GRAPH_DATA_BASE = {
10 | datasets: [
11 | {
12 | label: 'Produced Message Quantity',
13 | borderColor: "rgb(255, 99, 132)",
14 | lineTension: 1,
15 | fill: false,
16 | borderDash: [8, 4],
17 | data: [],
18 | },
19 | ],
20 | }
21 |
22 | const GRAPH_DATA_BASE_2 = {
23 | label: 'Produced Message Quantity',
24 | borderColor: "rgb(255, 99, 132)",
25 | lineTension: 1,
26 | fill: false,
27 | borderDash: [8, 4],
28 | }
29 |
30 |
31 | const Metrics = props => {
32 |
33 | const socket = io("http://localhost:5000");
34 |
35 | const [_data, _setData] = useState([]);
36 | const [_graphData, _setGraphData] = useState(GRAPH_DATA_BASE);
37 |
38 | const [totalMessagesConsumed, setTotalMessagesConsumed] = useState(0);
39 | const [clusterId, setClusterId] = useState(0);
40 | const [numOfBrokers, setNumOfBrokers] = useState(0);
41 | const [topicListInfoObj, setTopicListInfoObj] = useState(0);
42 | const [numOfTopics, setNumOfTopics] = useState(0);
43 | const [totalPartitions, setTotalPartitions] = useState(0);
44 | const [bytesTotalConsumer, setBytesTotalConsumer] = useState(0);
45 | const [totalProducerMessages, setTotalProducerMessages] = useState(0);
46 | const [producedMessagesTotalSize, setProducedMessagesTotalSize] = useState(0);
47 | const [liveData, setLiveData] = useState(0);
48 | const [data, setData] = useState({
49 | datasets: [
50 | {
51 | label: 'Produced Message Quantity',
52 | borderColor: "rgb(255, 99, 132)",
53 | lineTension: 1,
54 | fill: false,
55 | borderDash: [8, 4],
56 | data: [],
57 | },
58 | ],
59 | });
60 |
61 | const options = {
62 | scales: {
63 | xAxes: [
64 | {
65 | type: "realtime",
66 | realtime: {
67 | duration: 20000,
68 | refresh: 500,
69 | delay: 1000,
70 | onRefresh: null,
71 | },
72 | },
73 | ],
74 | },
75 | interaction: {
76 | intersect: false,
77 | },
78 | plugins: {
79 | title: {
80 | display: true,
81 | text: "Producer Data Size",
82 | },
83 | },
84 | responsive: true,
85 | maintainAspectRatio: true,
86 | elements: {
87 | line: {
88 | tension: 0.4,
89 | },
90 | },
91 | };
92 |
93 |
94 |
95 | useEffect( () => {
96 |
97 | // client-side
98 | socket.on("totalMessagesConsumed", data => {
99 | setTotalMessagesConsumed(data);
100 | });
101 |
102 | // send name of cluster from confluent
103 | socket.on("clusterId", data => {
104 | setClusterId(data);
105 | });
106 |
107 | // send total number of brokers in cluster
108 | socket.on("numOfBrokers", data => {
109 | setNumOfBrokers(data);
110 | });
111 |
112 | // sending object with topicName:NumOfPartitions key:value pairs
113 | socket.on("topicListInfoObj", data => {
114 | setTopicListInfoObj(data);
115 | });
116 |
117 | socket.on("numOfTopics", data => {
118 | setNumOfTopics(data);
119 | });
120 |
121 | socket.on("totalPartitions", data => {
122 | setTotalPartitions(data);
123 | });
124 |
125 | socket.on("bytesTotalConsumer", data => {
126 | setBytesTotalConsumer(bytesTotalConsumer + data);
127 | });
128 |
129 | //producer sent info
130 |
131 | socket.on("totalProducerMessages", producerData => {
132 | setTotalProducerMessages(totalProducerMessages + producerData);
133 | });
134 |
135 | socket.on("producedMessagesTotalSize", producerData => {
136 |
137 |
138 | setProducedMessagesTotalSize(producedMessagesTotalSize + producerData);
139 |
140 | });
141 |
142 | },[])
143 |
144 | return(
145 | //contains however many metric graphs needed
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 | )
160 | }
161 |
162 | export default Metrics;
--------------------------------------------------------------------------------
/react-app/src/containers/NavBarContainer.tsx:
--------------------------------------------------------------------------------
1 | import React, { FC, useState } from 'react';
2 |
3 | const NavBarContainer = props => {
4 | return(
5 | //holds whatever will we want to navigate to or other pages that are created
6 |
7 | )
8 | }
9 |
10 | export default NavBarContainer;
--------------------------------------------------------------------------------
/react-app/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | KafkaSentinel
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/react-app/src/index.scss:
--------------------------------------------------------------------------------
1 | body {
2 | // background-color: rgb(101, 164, 185);
3 | color: white;
4 |
5 | background: url(https://i.imgur.com/p43YlP9.jpg) no-repeat center center fixed;
6 | -webkit-background-size: cover;
7 | -moz-background-size: cover;
8 | -o-background-size: cover;
9 | background-size: cover;
10 | }
11 |
12 | h1 {
13 | font-size: 3rem;
14 | text-shadow: 2px 2px #8a27b1
15 | }
16 |
17 | h2 {
18 | font-size: 2rem;
19 | text-shadow: 2px 2px #8a27b1
20 | }
21 |
22 | .logo {
23 | height: 300px;
24 | width: auto;
25 | }
26 |
27 | .header {
28 | display: flex;
29 | align-items: center;
30 | justify-content: center;
31 | flex-direction: column;
32 | }
33 |
34 | .metricsContainer {
35 | display: flex;
36 | flex-direction: row;
37 | justify-content: center;
38 | margin-top: 0rem;
39 | flex-wrap: wrap;
40 | }
41 |
42 | .login-wrapper {
43 | display: flex;
44 | justify-content: center;
45 | margin-top: 8rem;
46 |
47 | }
48 |
49 | #formHeader {
50 | display: flex;
51 | justify-content: center;
52 | }
53 |
54 | #form-button {
55 | display: flex;
56 | justify-content: center;
57 | }
58 |
59 | .App {
60 | display: flex;
61 | align-items: center;
62 | justify-content: center;
63 | // margin-top: 5rem;
64 | // margin-right: 0px;
65 | margin: 1rem;
66 | }
67 |
68 | #loginForm {
69 | display: flex;
70 | flex-direction: column;
71 | justify-content: center;
72 | margin: 10px;
73 | text-shadow: 1.3px 1.3px #8a27b1;
74 | }
75 |
76 | .broker {
77 | display: flex;
78 | flex-direction: column;
79 | justify-content: center;
80 | margin: 10px;
81 | }
82 |
83 | .metricGraph {
84 | color: black;
85 | margin: 1rem;
86 | background: #f3f3f3;
87 | padding: 2rem;
88 | border: 1px solid lightgray;
89 | box-shadow: 1px 1px 5px rgba(22, 22, 22, 0.915);
90 | border-radius: 15px;
91 | }
--------------------------------------------------------------------------------
/react-app/src/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { render } from 'react-dom';
3 | import App from './app';
4 | import './index.scss';
5 |
6 | render(, document.getElementById('root'));
7 |
--------------------------------------------------------------------------------
/react-app/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */
4 |
5 | /* Basic Options */
6 | // "incremental": true, /* Enable incremental compilation */
7 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9 | // "lib": [], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | "jsx": "react", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
13 | "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
15 | "sourceMap": true, /* Generates corresponding '.map' file. */
16 | // "outFile": "./", /* Concatenate and emit output to single file. */
17 | "outDir": "./dist", /* Redirect output structure to the directory. */
18 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
19 | // "composite": true, /* Enable project compilation */
20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
21 | // "removeComments": true, /* Do not emit comments to output. */
22 | // "noEmit": true, /* Do not emit outputs. */
23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
26 |
27 | /* Strict Type-Checking Options */
28 | "strict": true, /* Enable all strict type-checking options. */
29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
30 | // "strictNullChecks": true, /* Enable strict null checks. */
31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
36 |
37 | /* Additional Checks */
38 | // "noUnusedLocals": true, /* Report errors on unused locals. */
39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
42 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
43 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */
44 | // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */
45 |
46 | /* Module Resolution Options */
47 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
48 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
49 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
50 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
51 | // "typeRoots": [], /* List of folders to include type definitions from. */
52 | // "types": [], /* Type declaration files to be included in compilation. */
53 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
54 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
55 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
56 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
57 |
58 | /* Source Map Options */
59 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
60 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
61 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
62 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
63 |
64 | /* Experimental Options */
65 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
66 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
67 |
68 | /* Advanced Options */
69 | "skipLibCheck": true, /* Skip type checking of declaration files. */
70 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/react-app/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const HtmlWebpackPlugin = require('html-webpack-plugin');
3 | const Dotenv = require('dotenv-webpack');
4 |
5 | module.exports = {
6 | mode: process.env.NODE_ENV || 'development',
7 | devtool: 'inline-source-map',
8 | entry: './src/index.tsx',
9 | output: {
10 | path: path.resolve(__dirname, 'dist'),
11 | publicPath: '/',
12 | filename: 'bundle.js',
13 | clean: true,
14 | },
15 | plugins: [
16 | new HtmlWebpackPlugin({
17 | template: './src/index.html',
18 | }),
19 | new Dotenv(),
20 | ],
21 | module: {
22 | rules: [
23 | {
24 | test: /\.tsx?$/,
25 | loader: 'ts-loader',
26 | exclude: /node_modules/,
27 | options: {
28 | transpileOnly: true,
29 | },
30 | },
31 | {
32 | test: /\.s?css$/,
33 | use: ['style-loader', 'css-loader', 'sass-loader'],
34 | },
35 | ],
36 | },
37 | resolve: {
38 | extensions: ['.ts', '.tsx', '.js', '.jsx'],
39 | // fallback: {
40 | // util: require.resolve("util/")
41 | // }
42 | },
43 | devServer: {
44 | port: 8080,
45 | contentBase: path.resolve(__dirname, 'dist'),
46 | publicPath: '/',
47 | host: 'localhost',
48 | compress: true,
49 | hot: true,
50 | historyApiFallback: true,
51 | proxy: {
52 | '/connectKafka': 'http://localhost:3000',
53 | '/setCookie': 'http://localhost:3000',
54 | '/checkCookie': 'http://localhost:3000',
55 | '/getClusterInfo': 'http://localhost:3000',
56 | },
57 | },
58 | };
59 |
--------------------------------------------------------------------------------