├── .gitattributes
├── .github
└── workflows
│ └── publish.yml
├── .gitignore
├── LICENSE
├── README.md
├── SOURCES.md
├── art
├── 221018-14.40.26lrg.mp4
├── 221111-14.11.25.mp4
├── 8a.gif
├── Image 2022-11-08 at 7.05.51 PM.png
├── Image 2022-11-11 at 9.19.20 PM.png
├── a.gif
├── a2.gif
├── arena.ai
├── comp2.mp4
├── gifinprogress.tif
├── layout.png
├── map.txt
├── notes.txt
├── palette.png
├── u4a.gif
├── u4b.gif
└── u4c.gif
├── karma.conf.js
├── package-lock.json
├── package.json
├── resources
└── public
│ ├── _asset
│ ├── UniVGA16.ttf
│ ├── gif
│ │ ├── planet.gif
│ │ ├── ripples.gif
│ │ ├── scroll.gif
│ │ ├── sparkle.gif
│ │ ├── takase.gif
│ │ └── tan.gif
│ ├── logo.png
│ └── svg
│ │ ├── arena-inv.svg
│ │ ├── arena.svg
│ │ ├── close.svg
│ │ ├── github-inv.svg
│ │ ├── github.svg
│ │ ├── power-inv.svg
│ │ └── power.svg
│ ├── _css
│ ├── base.css
│ └── reset.css
│ ├── favicon.ico
│ └── index.html
├── shadow-cljs.edn
└── src
└── kees
└── arena_graph
├── config.cljs
├── graphs.cljs
├── logic.cljs
├── main.cljs
├── rf.cljs
├── rf
├── console.cljs
└── flavor.cljs
└── views.cljs
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.github/workflows/publish.yml:
--------------------------------------------------------------------------------
1 | name: Build, sync, invalidate
2 |
3 | # NEEDS:
4 | # Secrets:
5 | # AWS_ACCESS_KEY_ID
6 | # AWS_SECRET_ACCESS_KEY
7 | # AWS_REGION
8 | # AWS_S3_BUCKET
9 | # AWS_CLOUDFRONT_DIST
10 | # UPDATE:
11 | # rm paths
12 | # s3 sync parameters
13 | # invalidation parameters
14 |
15 | on:
16 | workflow_dispatch:
17 |
18 | jobs:
19 | publish:
20 | runs-on: ubuntu-latest
21 |
22 | steps:
23 | - name: Checkout
24 | uses: actions/checkout@main
25 |
26 | - name: Cache (NPM)
27 | uses: actions/cache@main
28 | with:
29 | path: ~/.npm
30 | key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }}
31 | restore-keys: ${{ runner.os }}-node-modules-
32 | - name: Cache (shadow-cljs)
33 | uses: actions/cache@main
34 | with:
35 | path: .shadow-cljs
36 | key: ${{ runner.os }}-shadow-cljs-${{ hashFiles('**/shadow-cljs.edn') }}
37 | restore-keys: ${{ runner.os }}-shadow-cljs-
38 |
39 | - name: Build
40 | run: |
41 | npm i
42 | npm run release
43 |
44 | - name: Purge
45 | run: |
46 | rm -fv resources/public/_js/compiled/manifest.edn
47 | rm -rfv resources/public/_js/compiled/cljs-runtime
48 |
49 | - name: AWS Credentials
50 | uses: aws-actions/configure-aws-credentials@v1
51 | with:
52 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
53 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
54 | aws-region: ${{ secrets.AWS_REGION }}
55 |
56 | - name: Sync
57 | uses: badsyntax/github-action-aws-s3@master
58 | id: sync-html-s3
59 | with:
60 | bucket: ${{ secrets.AWS_S3_BUCKET }}
61 | aws-region: ${{ secrets.AWS_REGION }}
62 | action: 'sync'
63 | src-dir: './resources/public'
64 | prefix: 'projects/g02-graph'
65 | files-glob: '*'
66 |
67 | - name: Invalidate
68 | uses: badsyntax/github-action-aws-cloudfront@master
69 | with:
70 | distribution-id: ${{ secrets.AWS_CLOUDFRONT_DIST }}
71 | aws-region: ${{ secrets.AWS_REGION }}
72 | include-origin-prefix: false
73 | origin-prefix: ''
74 | invalidate-paths: '/projects/g02-graph/*'
75 | default-root-object: 'index.html'
76 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
3 | # Autogen files
4 | /.shadow-cljs/
5 | /.clj-kondo/
6 | /.lsp/
7 | /.calva/
8 | /*-init.clj
9 | /*.log
10 | /.nrepl-port
11 |
12 | # Project files
13 | /node_modules/
14 | /out/
15 | /target/
16 | /resources/public/_js/compiled/
17 | /dev/auth.cljs
18 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Kees
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # kees/arena-graph
2 |
3 | 
4 |
5 | ## What:
6 |
7 | The goal of this web app is visualize the [channels](https://support.are.na/help/whats-a-channel) an [are.na](https://www.are.na/) channel connects to, and their subsequent channel connections, in an interactive [undirected graph](https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)#Graph).
8 |
9 | The [d3 force graph layout](https://github.com/d3/d3-force) and [its react bindings](https://github.com/vasturiano/react-force-graph/) are really useful to make graphs that are kinetic, cute, fun, and descriptive, with very low effort using [reagent](https://github.com/reagent-project/reagent) in [CLJS](https://clojurescript.org/).
10 |
11 | ## And
12 |
13 | Going beyond the second order of connections (single parent channel → children → grandchildren) seems too heavy for a public-facing web app using a medium-size social website. I think this is the appropriate scope.
14 |
15 | Contributions are welcome. The UI framework I'm most comfortable with is [re-frame](https://github.com/day8/re-frame), so this whole app is built in clojurescript with re-frame.
16 |
17 | Native language additions are easiest, however, the whole JS/React/Node package ecosystem is at arm's reach and running isolated JS scripts on demand (maybe TS too) is also pretty easy.
18 |
19 | The current build is manually published and may not reflect the most recent changes. You can test the latest with:
20 |
21 | - A IDE supporting Clojure
22 | - A web browser with CORS security policies disabled.
23 | Example:
24 |
25 | ```sh
26 | rm -r /tmp/chro/ # Be careful
27 | open -na Chromium --args --disable-web-security --user-data-dir="/tmp/chro"
28 | ```
29 |
30 |
31 |
32 | - A clone of this repo
33 | - The commands below
34 |
35 | ## Upcoming:
36 |
37 |
38 | Tasks
39 |
40 | - [x] [re-frame-http-fx](https://github.com/day8/re-frame-http-fx) to better integrate [are.na API](https://dev.are.na/documentation/channels) requests into re-frame handlers ([1](https://day8.github.io/re-frame/EffectfulHandlers/) [2](https://day8.github.io/re-frame/Effects/))
41 | - [x] Better status output
42 | - [ ] Better division between state, logic, and flavor
43 | - [ ] Redo GET loops
44 | - [x] Separate request flows
45 | - [x] Original channel attributes / 0 order
46 | - [x] Directly connected channels / 1st order
47 | - [x] Mutually connected channels / 2nd order
48 | - [x] Node connectivity
49 | - [x] All 1st order connect to 0 order
50 | - [x] All 2nd order connect to relevant connections(!) not parents
51 | - [x] Request pagination
52 | - [x] Node styling
53 | - [x] Node size within variance by order
54 | - [x] Node random color within variance by order
55 | - [x] Oauth(?) realized it's unnecessary for an initial build
56 | - [x] Add hover info block
57 | - [ ] Flow layout and add visuals
58 | - [ ] UI refine
59 | - [x] Kill nonessential inputs
60 | - [x] Re-theme
61 | - [ ] More advanced button visibility state
62 | - [x] Funny anim block
63 | - [ ] Maximize content in space
64 | - [ ] Better loading / button visibility logic
65 | - [x] Mobile layout fix
66 |
67 |
68 |
69 | (archival)
70 |
71 |
72 | Old todo
73 |
74 | - [x] Channel info
75 | - [x] Restyle
76 | - [x] Add more information
77 | - [x] Progress bar for 1st order % completed callbacks
78 | - [x] Gifs loader
79 | - [x] Fix tangent gif
80 | - [x] Sliding doors
81 | - [x] Make sure sliding doors don’t lag
82 | (I think this is from 10x)
83 | - [x] Input
84 | - [x] Retime buttons
85 | - [x] Sliding door on load
86 | - [x] Skip intro
87 | - [ ] Mobile layout
88 | - [ ] Reflow properly
89 | - [ ] Set graph area dimensions on load based on window size
90 | - [x] Error handling
91 | - [x] Private channel silent fail
92 | - [ ] More descriptive progress logs
93 |
94 |
95 | ## What I'd welcome help with
96 |
97 | - Optimizing the way the app makes series of potentially many API requests
98 | - Further developing the styles of graph nodes and links. Basic react interop in CLJS is very easy but difficult to scale.
99 | - More fun features to interact with the visualization
100 | - Accessibility guidance
101 |
102 | ---
103 |
104 | Run this to work on the project. For now you can include your own token in [rf.cljs](src/kees/arena_graph/rf.cljs). The token is only necessary for private channels.
105 |
106 | ```sh
107 | npm i
108 | npm run watch # Or jack in
109 | open http://localhost:8280
110 | ```
111 |
--------------------------------------------------------------------------------
/SOURCES.md:
--------------------------------------------------------------------------------
1 | # Sources
2 |
3 | Keeping track of what sources used for external assets
4 |
5 | ## Gifs
6 |
7 | ### Completed
8 |
9 | - [Spinning planet](https://www.are.na/block/17786545)
10 | - [Glossy ripples](https://www.are.na/block/1440291)
11 | - [Graph thing](https://www.are.na/block/3721255)
12 | - [Virtual thumb scroll](https://www.are.na/block/537739)
13 | - [Star flicker](https://www.are.na/block/239405)
14 |
15 | ### Unused or incomplete
16 |
17 | - [CPU](https://www.are.na/block/13372663) (via [atenuousrowbetween](https://www.tumblr.com/atenuousrowbetween/96212983604/centralprocessingunitcpu-better-in-dark))
18 |
--------------------------------------------------------------------------------
/art/221018-14.40.26lrg.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/221018-14.40.26lrg.mp4
--------------------------------------------------------------------------------
/art/221111-14.11.25.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/221111-14.11.25.mp4
--------------------------------------------------------------------------------
/art/8a.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/8a.gif
--------------------------------------------------------------------------------
/art/Image 2022-11-08 at 7.05.51 PM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/Image 2022-11-08 at 7.05.51 PM.png
--------------------------------------------------------------------------------
/art/Image 2022-11-11 at 9.19.20 PM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/Image 2022-11-11 at 9.19.20 PM.png
--------------------------------------------------------------------------------
/art/a.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/a.gif
--------------------------------------------------------------------------------
/art/a2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/a2.gif
--------------------------------------------------------------------------------
/art/arena.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/arena.ai
--------------------------------------------------------------------------------
/art/comp2.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/comp2.mp4
--------------------------------------------------------------------------------
/art/gifinprogress.tif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/gifinprogress.tif
--------------------------------------------------------------------------------
/art/layout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/layout.png
--------------------------------------------------------------------------------
/art/map.txt:
--------------------------------------------------------------------------------
1 | #180906
2 | ;bg
3 |
4 | #F6CA18
5 | ; main
6 |
7 | ;#fcdf5d
8 | ;main lighter
9 |
10 | #9BF1E1
11 |
12 | #7FF7EF
13 | #7FE2B7
14 | #F7F54C
--------------------------------------------------------------------------------
/art/notes.txt:
--------------------------------------------------------------------------------
1 | #F6CA18 main color
2 | #180906 bg
3 | #fcdf5d lighter main color
4 |
5 | --change-color "#BBBBBB" "#180906" \
6 | --change-color "#FFFFFF" "#F6CA18" \
7 | --change-color "#F493F6" "#fcdf5d" \
8 | --change-color "#8EF7FB" "#fcdf5d" \
9 | --change-color "#94382E" "#9BF1E1" \
10 | --change-color "#4C8AF7" "#7FF7EF" \
11 | --change-color "#F88D48" "#7FE2B7" \
12 | --change-color "#F7F54C" "#F7F54C" \
13 |
14 | --change-color "#" "#" \
15 |
16 | --change-color "#000000" "#180906" \
17 | --change-color "#140e02" "#180906" \
18 | --change-color "#1a1202" "#180906" \
19 | --change-color "#4a3306" "#f6ca18" \
20 | --change-color "#80590a" "#f6ca18" \
21 | --change-color "#b37c0e" "#f6c709" \
22 | --change-color "#e7a012" "#fcdf5d" \
23 | --change-color "#efac27" "#fcdf5d" \
24 | --change-color "#f1b743" "#FCE683" \
25 | --change-color "#f3c05a" "#fadd6b" \
26 | --change-color "#f5ca74" "#fbe89d" \
27 | --change-color "#fefaf2" "#fdf4ce" \
--------------------------------------------------------------------------------
/art/palette.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/palette.png
--------------------------------------------------------------------------------
/art/u4a.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/u4a.gif
--------------------------------------------------------------------------------
/art/u4b.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/u4b.gif
--------------------------------------------------------------------------------
/art/u4c.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/art/u4c.gif
--------------------------------------------------------------------------------
/karma.conf.js:
--------------------------------------------------------------------------------
1 | module.exports = function (config) {
2 | var junitOutputDir = process.env.CIRCLE_TEST_REPORTS || "target/junit"
3 |
4 | config.set({
5 | browsers: ['ChromeHeadless'],
6 | basePath: 'target',
7 | files: ['karma-test.js'],
8 | frameworks: ['cljs-test'],
9 | plugins: [
10 | 'karma-cljs-test',
11 | 'karma-chrome-launcher',
12 | 'karma-junit-reporter'
13 | ],
14 | colors: true,
15 | logLevel: config.LOG_INFO,
16 | client: {
17 | args: ['shadow.test.karma.init']
18 | },
19 |
20 | // the default configuration
21 | junitReporter: {
22 | outputDir: junitOutputDir + '/karma', // results will be saved as outputDir/browserName.xml
23 | outputFile: undefined, // if included, results will be saved as outputDir/browserName/outputFile
24 | suite: '' // suite will become the package name attribute in xml testsuite element
25 | }
26 | })
27 | }
28 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "arena-graph",
3 | "lockfileVersion": 2,
4 | "requires": true,
5 | "packages": {
6 | "": {
7 | "name": "arena-graph",
8 | "dependencies": {
9 | "highlight.js": "11.5.1",
10 | "react": "17.0.2",
11 | "react-dom": "17.0.2",
12 | "react-force-graph-2d": "^1.23.11"
13 | },
14 | "devDependencies": {
15 | "shadow-cljs": "2.20.1"
16 | }
17 | },
18 | "node_modules/@tweenjs/tween.js": {
19 | "version": "18.6.4",
20 | "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz",
21 | "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ=="
22 | },
23 | "node_modules/accessor-fn": {
24 | "version": "1.3.2",
25 | "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.3.2.tgz",
26 | "integrity": "sha512-W4/Lj/gry8AHy+IC7Havr7fNbphHDzVAiZd5h10g8LRRz6ZKla3A1/lkFqoV1jh13R0eJLGWjDBlRGK36fcWiw=="
27 | },
28 | "node_modules/asn1.js": {
29 | "version": "5.4.1",
30 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
31 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
32 | "dev": true,
33 | "dependencies": {
34 | "bn.js": "^4.0.0",
35 | "inherits": "^2.0.1",
36 | "minimalistic-assert": "^1.0.0",
37 | "safer-buffer": "^2.1.0"
38 | }
39 | },
40 | "node_modules/asn1.js/node_modules/bn.js": {
41 | "version": "4.12.0",
42 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
43 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
44 | "dev": true
45 | },
46 | "node_modules/assert": {
47 | "version": "1.5.0",
48 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
49 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
50 | "dev": true,
51 | "dependencies": {
52 | "object-assign": "^4.1.1",
53 | "util": "0.10.3"
54 | }
55 | },
56 | "node_modules/assert/node_modules/inherits": {
57 | "version": "2.0.1",
58 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
59 | "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
60 | "dev": true
61 | },
62 | "node_modules/assert/node_modules/util": {
63 | "version": "0.10.3",
64 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
65 | "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
66 | "dev": true,
67 | "dependencies": {
68 | "inherits": "2.0.1"
69 | }
70 | },
71 | "node_modules/base64-js": {
72 | "version": "1.5.1",
73 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
74 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
75 | "dev": true,
76 | "funding": [
77 | {
78 | "type": "github",
79 | "url": "https://github.com/sponsors/feross"
80 | },
81 | {
82 | "type": "patreon",
83 | "url": "https://www.patreon.com/feross"
84 | },
85 | {
86 | "type": "consulting",
87 | "url": "https://feross.org/support"
88 | }
89 | ]
90 | },
91 | "node_modules/bezier-js": {
92 | "version": "6.1.0",
93 | "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.0.tgz",
94 | "integrity": "sha512-oc8fkHqG0R+dQuNiXVbPMB0cc8iDqkLAjbA2gq26QmV8tZqW9GGI7iNEX1ioRWlZperQS7v5BX03+9FLVWZbSw==",
95 | "funding": {
96 | "type": "individual",
97 | "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md"
98 | }
99 | },
100 | "node_modules/bn.js": {
101 | "version": "5.2.1",
102 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
103 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
104 | "dev": true
105 | },
106 | "node_modules/brorand": {
107 | "version": "1.1.0",
108 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
109 | "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
110 | "dev": true
111 | },
112 | "node_modules/browserify-aes": {
113 | "version": "1.2.0",
114 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
115 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
116 | "dev": true,
117 | "dependencies": {
118 | "buffer-xor": "^1.0.3",
119 | "cipher-base": "^1.0.0",
120 | "create-hash": "^1.1.0",
121 | "evp_bytestokey": "^1.0.3",
122 | "inherits": "^2.0.1",
123 | "safe-buffer": "^5.0.1"
124 | }
125 | },
126 | "node_modules/browserify-cipher": {
127 | "version": "1.0.1",
128 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
129 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
130 | "dev": true,
131 | "dependencies": {
132 | "browserify-aes": "^1.0.4",
133 | "browserify-des": "^1.0.0",
134 | "evp_bytestokey": "^1.0.0"
135 | }
136 | },
137 | "node_modules/browserify-des": {
138 | "version": "1.0.2",
139 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
140 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
141 | "dev": true,
142 | "dependencies": {
143 | "cipher-base": "^1.0.1",
144 | "des.js": "^1.0.0",
145 | "inherits": "^2.0.1",
146 | "safe-buffer": "^5.1.2"
147 | }
148 | },
149 | "node_modules/browserify-rsa": {
150 | "version": "4.1.0",
151 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
152 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
153 | "dev": true,
154 | "dependencies": {
155 | "bn.js": "^5.0.0",
156 | "randombytes": "^2.0.1"
157 | }
158 | },
159 | "node_modules/browserify-sign": {
160 | "version": "4.2.1",
161 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
162 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
163 | "dev": true,
164 | "dependencies": {
165 | "bn.js": "^5.1.1",
166 | "browserify-rsa": "^4.0.1",
167 | "create-hash": "^1.2.0",
168 | "create-hmac": "^1.1.7",
169 | "elliptic": "^6.5.3",
170 | "inherits": "^2.0.4",
171 | "parse-asn1": "^5.1.5",
172 | "readable-stream": "^3.6.0",
173 | "safe-buffer": "^5.2.0"
174 | }
175 | },
176 | "node_modules/browserify-sign/node_modules/readable-stream": {
177 | "version": "3.6.0",
178 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
179 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
180 | "dev": true,
181 | "dependencies": {
182 | "inherits": "^2.0.3",
183 | "string_decoder": "^1.1.1",
184 | "util-deprecate": "^1.0.1"
185 | },
186 | "engines": {
187 | "node": ">= 6"
188 | }
189 | },
190 | "node_modules/browserify-zlib": {
191 | "version": "0.2.0",
192 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
193 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
194 | "dev": true,
195 | "dependencies": {
196 | "pako": "~1.0.5"
197 | }
198 | },
199 | "node_modules/buffer": {
200 | "version": "4.9.2",
201 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
202 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
203 | "dev": true,
204 | "dependencies": {
205 | "base64-js": "^1.0.2",
206 | "ieee754": "^1.1.4",
207 | "isarray": "^1.0.0"
208 | }
209 | },
210 | "node_modules/buffer-xor": {
211 | "version": "1.0.3",
212 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
213 | "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
214 | "dev": true
215 | },
216 | "node_modules/builtin-status-codes": {
217 | "version": "3.0.0",
218 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
219 | "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
220 | "dev": true
221 | },
222 | "node_modules/canvas-color-tracker": {
223 | "version": "1.1.6",
224 | "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.1.6.tgz",
225 | "integrity": "sha512-LpKiona7TwN0rpLgGcdvAw/HVV9HGCSSyOoSJkLyUP+VZmTX2uAnunGVoKrEHQ/7i+lyu6HfazdHV93vLrjK5Q==",
226 | "dependencies": {
227 | "tinycolor2": "^1.4.2"
228 | }
229 | },
230 | "node_modules/cipher-base": {
231 | "version": "1.0.4",
232 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
233 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
234 | "dev": true,
235 | "dependencies": {
236 | "inherits": "^2.0.1",
237 | "safe-buffer": "^5.0.1"
238 | }
239 | },
240 | "node_modules/console-browserify": {
241 | "version": "1.2.0",
242 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
243 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
244 | "dev": true
245 | },
246 | "node_modules/constants-browserify": {
247 | "version": "1.0.0",
248 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
249 | "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
250 | "dev": true
251 | },
252 | "node_modules/core-util-is": {
253 | "version": "1.0.3",
254 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
255 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
256 | "dev": true
257 | },
258 | "node_modules/create-ecdh": {
259 | "version": "4.0.4",
260 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
261 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
262 | "dev": true,
263 | "dependencies": {
264 | "bn.js": "^4.1.0",
265 | "elliptic": "^6.5.3"
266 | }
267 | },
268 | "node_modules/create-ecdh/node_modules/bn.js": {
269 | "version": "4.12.0",
270 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
271 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
272 | "dev": true
273 | },
274 | "node_modules/create-hash": {
275 | "version": "1.2.0",
276 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
277 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
278 | "dev": true,
279 | "dependencies": {
280 | "cipher-base": "^1.0.1",
281 | "inherits": "^2.0.1",
282 | "md5.js": "^1.3.4",
283 | "ripemd160": "^2.0.1",
284 | "sha.js": "^2.4.0"
285 | }
286 | },
287 | "node_modules/create-hmac": {
288 | "version": "1.1.7",
289 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
290 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
291 | "dev": true,
292 | "dependencies": {
293 | "cipher-base": "^1.0.3",
294 | "create-hash": "^1.1.0",
295 | "inherits": "^2.0.1",
296 | "ripemd160": "^2.0.0",
297 | "safe-buffer": "^5.0.1",
298 | "sha.js": "^2.4.8"
299 | }
300 | },
301 | "node_modules/crypto-browserify": {
302 | "version": "3.12.0",
303 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
304 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
305 | "dev": true,
306 | "dependencies": {
307 | "browserify-cipher": "^1.0.0",
308 | "browserify-sign": "^4.0.0",
309 | "create-ecdh": "^4.0.0",
310 | "create-hash": "^1.1.0",
311 | "create-hmac": "^1.1.0",
312 | "diffie-hellman": "^5.0.0",
313 | "inherits": "^2.0.1",
314 | "pbkdf2": "^3.0.3",
315 | "public-encrypt": "^4.0.0",
316 | "randombytes": "^2.0.0",
317 | "randomfill": "^1.0.3"
318 | },
319 | "engines": {
320 | "node": "*"
321 | }
322 | },
323 | "node_modules/d3-array": {
324 | "version": "3.2.0",
325 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
326 | "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
327 | "dependencies": {
328 | "internmap": "1 - 2"
329 | },
330 | "engines": {
331 | "node": ">=12"
332 | }
333 | },
334 | "node_modules/d3-binarytree": {
335 | "version": "0.2.2",
336 | "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-0.2.2.tgz",
337 | "integrity": "sha512-TmgSEKWO4lSjX26Rk77hbTdiF3TQ1v5LqL+cmSz6/5RiSxmq6+e6qHE6X/KwrsIESekhEReH63X5yM8dvXaT7A=="
338 | },
339 | "node_modules/d3-color": {
340 | "version": "3.1.0",
341 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
342 | "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
343 | "engines": {
344 | "node": ">=12"
345 | }
346 | },
347 | "node_modules/d3-dispatch": {
348 | "version": "3.0.1",
349 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
350 | "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
351 | "engines": {
352 | "node": ">=12"
353 | }
354 | },
355 | "node_modules/d3-drag": {
356 | "version": "3.0.0",
357 | "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
358 | "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
359 | "dependencies": {
360 | "d3-dispatch": "1 - 3",
361 | "d3-selection": "3"
362 | },
363 | "engines": {
364 | "node": ">=12"
365 | }
366 | },
367 | "node_modules/d3-ease": {
368 | "version": "3.0.1",
369 | "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
370 | "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
371 | "engines": {
372 | "node": ">=12"
373 | }
374 | },
375 | "node_modules/d3-force-3d": {
376 | "version": "3.0.3",
377 | "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.3.tgz",
378 | "integrity": "sha512-8HGTbw6y35UYManGCPU4+b9/PGgnyjzRq80DRsp7zFsRl0leVz2pzwx18dwkPe4rDxTOEpM4BuWQ2krbVaGQQA==",
379 | "dependencies": {
380 | "d3-binarytree": "^0.2.0",
381 | "d3-dispatch": "1 - 3",
382 | "d3-octree": "^0.2.0",
383 | "d3-quadtree": "1 - 3",
384 | "d3-timer": "1 - 3"
385 | },
386 | "engines": {
387 | "node": ">=12"
388 | }
389 | },
390 | "node_modules/d3-format": {
391 | "version": "3.1.0",
392 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
393 | "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
394 | "engines": {
395 | "node": ">=12"
396 | }
397 | },
398 | "node_modules/d3-interpolate": {
399 | "version": "3.0.1",
400 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
401 | "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
402 | "dependencies": {
403 | "d3-color": "1 - 3"
404 | },
405 | "engines": {
406 | "node": ">=12"
407 | }
408 | },
409 | "node_modules/d3-octree": {
410 | "version": "0.2.2",
411 | "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-0.2.2.tgz",
412 | "integrity": "sha512-ysk9uSPAhZVb0Gq4GXzghl/Yqxu80dHrq55I53qaIMdGB65+0UfO84sr4Fci2JHumcgh6H4WE0r8LwxPagkE+g=="
413 | },
414 | "node_modules/d3-quadtree": {
415 | "version": "3.0.1",
416 | "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
417 | "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
418 | "engines": {
419 | "node": ">=12"
420 | }
421 | },
422 | "node_modules/d3-scale": {
423 | "version": "4.0.2",
424 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
425 | "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
426 | "dependencies": {
427 | "d3-array": "2.10.0 - 3",
428 | "d3-format": "1 - 3",
429 | "d3-interpolate": "1.2.0 - 3",
430 | "d3-time": "2.1.1 - 3",
431 | "d3-time-format": "2 - 4"
432 | },
433 | "engines": {
434 | "node": ">=12"
435 | }
436 | },
437 | "node_modules/d3-scale-chromatic": {
438 | "version": "3.0.0",
439 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
440 | "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
441 | "dependencies": {
442 | "d3-color": "1 - 3",
443 | "d3-interpolate": "1 - 3"
444 | },
445 | "engines": {
446 | "node": ">=12"
447 | }
448 | },
449 | "node_modules/d3-selection": {
450 | "version": "3.0.0",
451 | "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
452 | "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
453 | "engines": {
454 | "node": ">=12"
455 | }
456 | },
457 | "node_modules/d3-time": {
458 | "version": "3.0.0",
459 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
460 | "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
461 | "dependencies": {
462 | "d3-array": "2 - 3"
463 | },
464 | "engines": {
465 | "node": ">=12"
466 | }
467 | },
468 | "node_modules/d3-time-format": {
469 | "version": "4.1.0",
470 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
471 | "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
472 | "dependencies": {
473 | "d3-time": "1 - 3"
474 | },
475 | "engines": {
476 | "node": ">=12"
477 | }
478 | },
479 | "node_modules/d3-timer": {
480 | "version": "3.0.1",
481 | "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
482 | "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
483 | "engines": {
484 | "node": ">=12"
485 | }
486 | },
487 | "node_modules/d3-transition": {
488 | "version": "3.0.1",
489 | "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
490 | "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
491 | "dependencies": {
492 | "d3-color": "1 - 3",
493 | "d3-dispatch": "1 - 3",
494 | "d3-ease": "1 - 3",
495 | "d3-interpolate": "1 - 3",
496 | "d3-timer": "1 - 3"
497 | },
498 | "engines": {
499 | "node": ">=12"
500 | },
501 | "peerDependencies": {
502 | "d3-selection": "2 - 3"
503 | }
504 | },
505 | "node_modules/d3-zoom": {
506 | "version": "3.0.0",
507 | "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
508 | "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
509 | "dependencies": {
510 | "d3-dispatch": "1 - 3",
511 | "d3-drag": "2 - 3",
512 | "d3-interpolate": "1 - 3",
513 | "d3-selection": "2 - 3",
514 | "d3-transition": "2 - 3"
515 | },
516 | "engines": {
517 | "node": ">=12"
518 | }
519 | },
520 | "node_modules/debounce": {
521 | "version": "1.2.1",
522 | "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
523 | "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
524 | },
525 | "node_modules/des.js": {
526 | "version": "1.0.1",
527 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
528 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
529 | "dev": true,
530 | "dependencies": {
531 | "inherits": "^2.0.1",
532 | "minimalistic-assert": "^1.0.0"
533 | }
534 | },
535 | "node_modules/diffie-hellman": {
536 | "version": "5.0.3",
537 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
538 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
539 | "dev": true,
540 | "dependencies": {
541 | "bn.js": "^4.1.0",
542 | "miller-rabin": "^4.0.0",
543 | "randombytes": "^2.0.0"
544 | }
545 | },
546 | "node_modules/diffie-hellman/node_modules/bn.js": {
547 | "version": "4.12.0",
548 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
549 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
550 | "dev": true
551 | },
552 | "node_modules/domain-browser": {
553 | "version": "1.2.0",
554 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
555 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
556 | "dev": true,
557 | "engines": {
558 | "node": ">=0.4",
559 | "npm": ">=1.2"
560 | }
561 | },
562 | "node_modules/elliptic": {
563 | "version": "6.5.4",
564 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
565 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
566 | "dev": true,
567 | "dependencies": {
568 | "bn.js": "^4.11.9",
569 | "brorand": "^1.1.0",
570 | "hash.js": "^1.0.0",
571 | "hmac-drbg": "^1.0.1",
572 | "inherits": "^2.0.4",
573 | "minimalistic-assert": "^1.0.1",
574 | "minimalistic-crypto-utils": "^1.0.1"
575 | }
576 | },
577 | "node_modules/elliptic/node_modules/bn.js": {
578 | "version": "4.12.0",
579 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
580 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
581 | "dev": true
582 | },
583 | "node_modules/events": {
584 | "version": "3.3.0",
585 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
586 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
587 | "dev": true,
588 | "engines": {
589 | "node": ">=0.8.x"
590 | }
591 | },
592 | "node_modules/evp_bytestokey": {
593 | "version": "1.0.3",
594 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
595 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
596 | "dev": true,
597 | "dependencies": {
598 | "md5.js": "^1.3.4",
599 | "safe-buffer": "^5.1.1"
600 | }
601 | },
602 | "node_modules/force-graph": {
603 | "version": "1.42.16",
604 | "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.42.16.tgz",
605 | "integrity": "sha512-ypgtQHOZCPDTB1nVB5k1CpEdaqjCzuLpNKd9msuoLwisBQtXE1V11PDLIza7Y06C3mPAHc+dl49GyQi8V1SR5w==",
606 | "dependencies": {
607 | "@tweenjs/tween.js": "18",
608 | "accessor-fn": "1",
609 | "bezier-js": "3 - 6",
610 | "canvas-color-tracker": "1",
611 | "d3-array": "1 - 3",
612 | "d3-drag": "2 - 3",
613 | "d3-force-3d": "2 - 3",
614 | "d3-scale": "1 - 4",
615 | "d3-scale-chromatic": "1 - 3",
616 | "d3-selection": "2 - 3",
617 | "d3-zoom": "2 - 3",
618 | "index-array-by": "1",
619 | "kapsule": "^1.13",
620 | "lodash.throttle": "4"
621 | }
622 | },
623 | "node_modules/fromentries": {
624 | "version": "1.3.2",
625 | "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
626 | "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
627 | "funding": [
628 | {
629 | "type": "github",
630 | "url": "https://github.com/sponsors/feross"
631 | },
632 | {
633 | "type": "patreon",
634 | "url": "https://www.patreon.com/feross"
635 | },
636 | {
637 | "type": "consulting",
638 | "url": "https://feross.org/support"
639 | }
640 | ]
641 | },
642 | "node_modules/hash-base": {
643 | "version": "3.1.0",
644 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
645 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
646 | "dev": true,
647 | "dependencies": {
648 | "inherits": "^2.0.4",
649 | "readable-stream": "^3.6.0",
650 | "safe-buffer": "^5.2.0"
651 | },
652 | "engines": {
653 | "node": ">=4"
654 | }
655 | },
656 | "node_modules/hash-base/node_modules/readable-stream": {
657 | "version": "3.6.0",
658 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
659 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
660 | "dev": true,
661 | "dependencies": {
662 | "inherits": "^2.0.3",
663 | "string_decoder": "^1.1.1",
664 | "util-deprecate": "^1.0.1"
665 | },
666 | "engines": {
667 | "node": ">= 6"
668 | }
669 | },
670 | "node_modules/hash.js": {
671 | "version": "1.1.7",
672 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
673 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
674 | "dev": true,
675 | "dependencies": {
676 | "inherits": "^2.0.3",
677 | "minimalistic-assert": "^1.0.1"
678 | }
679 | },
680 | "node_modules/highlight.js": {
681 | "version": "11.5.1",
682 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz",
683 | "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==",
684 | "engines": {
685 | "node": ">=12.0.0"
686 | }
687 | },
688 | "node_modules/hmac-drbg": {
689 | "version": "1.0.1",
690 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
691 | "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
692 | "dev": true,
693 | "dependencies": {
694 | "hash.js": "^1.0.3",
695 | "minimalistic-assert": "^1.0.0",
696 | "minimalistic-crypto-utils": "^1.0.1"
697 | }
698 | },
699 | "node_modules/https-browserify": {
700 | "version": "1.0.0",
701 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
702 | "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
703 | "dev": true
704 | },
705 | "node_modules/ieee754": {
706 | "version": "1.2.1",
707 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
708 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
709 | "dev": true,
710 | "funding": [
711 | {
712 | "type": "github",
713 | "url": "https://github.com/sponsors/feross"
714 | },
715 | {
716 | "type": "patreon",
717 | "url": "https://www.patreon.com/feross"
718 | },
719 | {
720 | "type": "consulting",
721 | "url": "https://feross.org/support"
722 | }
723 | ]
724 | },
725 | "node_modules/index-array-by": {
726 | "version": "1.3.3",
727 | "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.3.3.tgz",
728 | "integrity": "sha512-dpqV1sX+hx4s0RqAT97ypk9xzcAXJ0XK27p3bTgPy8bjbJAX6Kf7RU3pPXgmg9hhO7f5/WxO354v2f/A0/fz3Q=="
729 | },
730 | "node_modules/inherits": {
731 | "version": "2.0.4",
732 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
733 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
734 | "dev": true
735 | },
736 | "node_modules/internmap": {
737 | "version": "2.0.3",
738 | "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
739 | "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
740 | "engines": {
741 | "node": ">=12"
742 | }
743 | },
744 | "node_modules/isarray": {
745 | "version": "1.0.0",
746 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
747 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
748 | "dev": true
749 | },
750 | "node_modules/isexe": {
751 | "version": "2.0.0",
752 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
753 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
754 | "dev": true
755 | },
756 | "node_modules/jerrypick": {
757 | "version": "1.0.5",
758 | "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.0.5.tgz",
759 | "integrity": "sha512-95dIyL2QXqevDDJ70rmiqKLsTi+riZftLQo708tSFR/O5pQOf6VscDhjnN8mkNQwqnQmGhw+6dfZ5d4bmH/yww=="
760 | },
761 | "node_modules/js-tokens": {
762 | "version": "4.0.0",
763 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
764 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
765 | },
766 | "node_modules/kapsule": {
767 | "version": "1.13.8",
768 | "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.13.8.tgz",
769 | "integrity": "sha512-Y1lLt1htHNofIM5kxS5OdEqDm7WFqHF4hm6DrrvNEKIJugfQrxDBycV41QI5FpnBGHqyBD99VpTB5ARnlufP6w==",
770 | "dependencies": {
771 | "debounce": "^1.2.1"
772 | }
773 | },
774 | "node_modules/lodash.throttle": {
775 | "version": "4.1.1",
776 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
777 | "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
778 | },
779 | "node_modules/loose-envify": {
780 | "version": "1.4.0",
781 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
782 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
783 | "dependencies": {
784 | "js-tokens": "^3.0.0 || ^4.0.0"
785 | },
786 | "bin": {
787 | "loose-envify": "cli.js"
788 | }
789 | },
790 | "node_modules/md5.js": {
791 | "version": "1.3.5",
792 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
793 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
794 | "dev": true,
795 | "dependencies": {
796 | "hash-base": "^3.0.0",
797 | "inherits": "^2.0.1",
798 | "safe-buffer": "^5.1.2"
799 | }
800 | },
801 | "node_modules/miller-rabin": {
802 | "version": "4.0.1",
803 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
804 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
805 | "dev": true,
806 | "dependencies": {
807 | "bn.js": "^4.0.0",
808 | "brorand": "^1.0.1"
809 | },
810 | "bin": {
811 | "miller-rabin": "bin/miller-rabin"
812 | }
813 | },
814 | "node_modules/miller-rabin/node_modules/bn.js": {
815 | "version": "4.12.0",
816 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
817 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
818 | "dev": true
819 | },
820 | "node_modules/minimalistic-assert": {
821 | "version": "1.0.1",
822 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
823 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
824 | "dev": true
825 | },
826 | "node_modules/minimalistic-crypto-utils": {
827 | "version": "1.0.1",
828 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
829 | "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
830 | "dev": true
831 | },
832 | "node_modules/node-libs-browser": {
833 | "version": "2.2.1",
834 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
835 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
836 | "dev": true,
837 | "dependencies": {
838 | "assert": "^1.1.1",
839 | "browserify-zlib": "^0.2.0",
840 | "buffer": "^4.3.0",
841 | "console-browserify": "^1.1.0",
842 | "constants-browserify": "^1.0.0",
843 | "crypto-browserify": "^3.11.0",
844 | "domain-browser": "^1.1.1",
845 | "events": "^3.0.0",
846 | "https-browserify": "^1.0.0",
847 | "os-browserify": "^0.3.0",
848 | "path-browserify": "0.0.1",
849 | "process": "^0.11.10",
850 | "punycode": "^1.2.4",
851 | "querystring-es3": "^0.2.0",
852 | "readable-stream": "^2.3.3",
853 | "stream-browserify": "^2.0.1",
854 | "stream-http": "^2.7.2",
855 | "string_decoder": "^1.0.0",
856 | "timers-browserify": "^2.0.4",
857 | "tty-browserify": "0.0.0",
858 | "url": "^0.11.0",
859 | "util": "^0.11.0",
860 | "vm-browserify": "^1.0.1"
861 | }
862 | },
863 | "node_modules/object-assign": {
864 | "version": "4.1.1",
865 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
866 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
867 | "engines": {
868 | "node": ">=0.10.0"
869 | }
870 | },
871 | "node_modules/os-browserify": {
872 | "version": "0.3.0",
873 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
874 | "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
875 | "dev": true
876 | },
877 | "node_modules/pako": {
878 | "version": "1.0.11",
879 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
880 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
881 | "dev": true
882 | },
883 | "node_modules/parse-asn1": {
884 | "version": "5.1.6",
885 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
886 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
887 | "dev": true,
888 | "dependencies": {
889 | "asn1.js": "^5.2.0",
890 | "browserify-aes": "^1.0.0",
891 | "evp_bytestokey": "^1.0.0",
892 | "pbkdf2": "^3.0.3",
893 | "safe-buffer": "^5.1.1"
894 | }
895 | },
896 | "node_modules/path-browserify": {
897 | "version": "0.0.1",
898 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
899 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
900 | "dev": true
901 | },
902 | "node_modules/pbkdf2": {
903 | "version": "3.1.2",
904 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
905 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
906 | "dev": true,
907 | "dependencies": {
908 | "create-hash": "^1.1.2",
909 | "create-hmac": "^1.1.4",
910 | "ripemd160": "^2.0.1",
911 | "safe-buffer": "^5.0.1",
912 | "sha.js": "^2.4.8"
913 | },
914 | "engines": {
915 | "node": ">=0.12"
916 | }
917 | },
918 | "node_modules/process": {
919 | "version": "0.11.10",
920 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
921 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
922 | "dev": true,
923 | "engines": {
924 | "node": ">= 0.6.0"
925 | }
926 | },
927 | "node_modules/process-nextick-args": {
928 | "version": "2.0.1",
929 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
930 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
931 | "dev": true
932 | },
933 | "node_modules/prop-types": {
934 | "version": "15.8.1",
935 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
936 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
937 | "dependencies": {
938 | "loose-envify": "^1.4.0",
939 | "object-assign": "^4.1.1",
940 | "react-is": "^16.13.1"
941 | }
942 | },
943 | "node_modules/public-encrypt": {
944 | "version": "4.0.3",
945 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
946 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
947 | "dev": true,
948 | "dependencies": {
949 | "bn.js": "^4.1.0",
950 | "browserify-rsa": "^4.0.0",
951 | "create-hash": "^1.1.0",
952 | "parse-asn1": "^5.0.0",
953 | "randombytes": "^2.0.1",
954 | "safe-buffer": "^5.1.2"
955 | }
956 | },
957 | "node_modules/public-encrypt/node_modules/bn.js": {
958 | "version": "4.12.0",
959 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
960 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
961 | "dev": true
962 | },
963 | "node_modules/punycode": {
964 | "version": "1.4.1",
965 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
966 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
967 | "dev": true
968 | },
969 | "node_modules/querystring": {
970 | "version": "0.2.0",
971 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
972 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
973 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
974 | "dev": true,
975 | "engines": {
976 | "node": ">=0.4.x"
977 | }
978 | },
979 | "node_modules/querystring-es3": {
980 | "version": "0.2.1",
981 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
982 | "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
983 | "dev": true,
984 | "engines": {
985 | "node": ">=0.4.x"
986 | }
987 | },
988 | "node_modules/randombytes": {
989 | "version": "2.1.0",
990 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
991 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
992 | "dev": true,
993 | "dependencies": {
994 | "safe-buffer": "^5.1.0"
995 | }
996 | },
997 | "node_modules/randomfill": {
998 | "version": "1.0.4",
999 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
1000 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
1001 | "dev": true,
1002 | "dependencies": {
1003 | "randombytes": "^2.0.5",
1004 | "safe-buffer": "^5.1.0"
1005 | }
1006 | },
1007 | "node_modules/react": {
1008 | "version": "17.0.2",
1009 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
1010 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
1011 | "dependencies": {
1012 | "loose-envify": "^1.1.0",
1013 | "object-assign": "^4.1.1"
1014 | },
1015 | "engines": {
1016 | "node": ">=0.10.0"
1017 | }
1018 | },
1019 | "node_modules/react-dom": {
1020 | "version": "17.0.2",
1021 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
1022 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
1023 | "dependencies": {
1024 | "loose-envify": "^1.1.0",
1025 | "object-assign": "^4.1.1",
1026 | "scheduler": "^0.20.2"
1027 | },
1028 | "peerDependencies": {
1029 | "react": "17.0.2"
1030 | }
1031 | },
1032 | "node_modules/react-force-graph-2d": {
1033 | "version": "1.23.13",
1034 | "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.23.13.tgz",
1035 | "integrity": "sha512-mdw9r5Ob4yCYaWHSqFmO9lUtZq4ERZSBo+CIO7CD7d13PNrjNI/lVIBCsR/elj6f1AzQ9vqyrAUIsE+5BlaLkw==",
1036 | "dependencies": {
1037 | "force-graph": "^1.42",
1038 | "prop-types": "^15.8",
1039 | "react-kapsule": "^2.2"
1040 | },
1041 | "peerDependencies": {
1042 | "react": "*"
1043 | }
1044 | },
1045 | "node_modules/react-is": {
1046 | "version": "16.13.1",
1047 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
1048 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
1049 | },
1050 | "node_modules/react-kapsule": {
1051 | "version": "2.2.6",
1052 | "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.2.6.tgz",
1053 | "integrity": "sha512-OUfvKeXSwpwVcGhyUWK6XaStEAA/KWFvlRAo/maS+GWhp7X0mSMbuZ/5jBACXhTFNGqWHf5yyt+LURiWA77HfA==",
1054 | "dependencies": {
1055 | "fromentries": "^1.3.2",
1056 | "jerrypick": "^1.0.5"
1057 | },
1058 | "peerDependencies": {
1059 | "react": ">=16.13.1"
1060 | }
1061 | },
1062 | "node_modules/readable-stream": {
1063 | "version": "2.3.7",
1064 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1065 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1066 | "dev": true,
1067 | "dependencies": {
1068 | "core-util-is": "~1.0.0",
1069 | "inherits": "~2.0.3",
1070 | "isarray": "~1.0.0",
1071 | "process-nextick-args": "~2.0.0",
1072 | "safe-buffer": "~5.1.1",
1073 | "string_decoder": "~1.1.1",
1074 | "util-deprecate": "~1.0.1"
1075 | }
1076 | },
1077 | "node_modules/readable-stream/node_modules/safe-buffer": {
1078 | "version": "5.1.2",
1079 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1080 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1081 | "dev": true
1082 | },
1083 | "node_modules/readable-stream/node_modules/string_decoder": {
1084 | "version": "1.1.1",
1085 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1086 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1087 | "dev": true,
1088 | "dependencies": {
1089 | "safe-buffer": "~5.1.0"
1090 | }
1091 | },
1092 | "node_modules/readline-sync": {
1093 | "version": "1.4.10",
1094 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
1095 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
1096 | "dev": true,
1097 | "engines": {
1098 | "node": ">= 0.8.0"
1099 | }
1100 | },
1101 | "node_modules/ripemd160": {
1102 | "version": "2.0.2",
1103 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
1104 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
1105 | "dev": true,
1106 | "dependencies": {
1107 | "hash-base": "^3.0.0",
1108 | "inherits": "^2.0.1"
1109 | }
1110 | },
1111 | "node_modules/safe-buffer": {
1112 | "version": "5.2.1",
1113 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1114 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1115 | "dev": true,
1116 | "funding": [
1117 | {
1118 | "type": "github",
1119 | "url": "https://github.com/sponsors/feross"
1120 | },
1121 | {
1122 | "type": "patreon",
1123 | "url": "https://www.patreon.com/feross"
1124 | },
1125 | {
1126 | "type": "consulting",
1127 | "url": "https://feross.org/support"
1128 | }
1129 | ]
1130 | },
1131 | "node_modules/safer-buffer": {
1132 | "version": "2.1.2",
1133 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1134 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1135 | "dev": true
1136 | },
1137 | "node_modules/scheduler": {
1138 | "version": "0.20.2",
1139 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
1140 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
1141 | "dependencies": {
1142 | "loose-envify": "^1.1.0",
1143 | "object-assign": "^4.1.1"
1144 | }
1145 | },
1146 | "node_modules/setimmediate": {
1147 | "version": "1.0.5",
1148 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
1149 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
1150 | "dev": true
1151 | },
1152 | "node_modules/sha.js": {
1153 | "version": "2.4.11",
1154 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
1155 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
1156 | "dev": true,
1157 | "dependencies": {
1158 | "inherits": "^2.0.1",
1159 | "safe-buffer": "^5.0.1"
1160 | },
1161 | "bin": {
1162 | "sha.js": "bin.js"
1163 | }
1164 | },
1165 | "node_modules/shadow-cljs": {
1166 | "version": "2.20.1",
1167 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.20.1.tgz",
1168 | "integrity": "sha512-hzx3noRw200I4H9f1b1WX61chRUOuGNZCiDkuM/4s+6dxKseS01FFScqOoe7UXwJFff/omoU9rGzh4R9oXtD+A==",
1169 | "dev": true,
1170 | "dependencies": {
1171 | "node-libs-browser": "^2.2.1",
1172 | "readline-sync": "^1.4.7",
1173 | "shadow-cljs-jar": "1.3.2",
1174 | "source-map-support": "^0.4.15",
1175 | "which": "^1.3.1",
1176 | "ws": "^7.4.6"
1177 | },
1178 | "bin": {
1179 | "shadow-cljs": "cli/runner.js"
1180 | },
1181 | "engines": {
1182 | "node": ">=6.0.0"
1183 | }
1184 | },
1185 | "node_modules/shadow-cljs-jar": {
1186 | "version": "1.3.2",
1187 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz",
1188 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==",
1189 | "dev": true
1190 | },
1191 | "node_modules/source-map": {
1192 | "version": "0.5.7",
1193 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1194 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
1195 | "dev": true,
1196 | "engines": {
1197 | "node": ">=0.10.0"
1198 | }
1199 | },
1200 | "node_modules/source-map-support": {
1201 | "version": "0.4.18",
1202 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
1203 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
1204 | "dev": true,
1205 | "dependencies": {
1206 | "source-map": "^0.5.6"
1207 | }
1208 | },
1209 | "node_modules/stream-browserify": {
1210 | "version": "2.0.2",
1211 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
1212 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
1213 | "dev": true,
1214 | "dependencies": {
1215 | "inherits": "~2.0.1",
1216 | "readable-stream": "^2.0.2"
1217 | }
1218 | },
1219 | "node_modules/stream-http": {
1220 | "version": "2.8.3",
1221 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
1222 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
1223 | "dev": true,
1224 | "dependencies": {
1225 | "builtin-status-codes": "^3.0.0",
1226 | "inherits": "^2.0.1",
1227 | "readable-stream": "^2.3.6",
1228 | "to-arraybuffer": "^1.0.0",
1229 | "xtend": "^4.0.0"
1230 | }
1231 | },
1232 | "node_modules/string_decoder": {
1233 | "version": "1.3.0",
1234 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1235 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1236 | "dev": true,
1237 | "dependencies": {
1238 | "safe-buffer": "~5.2.0"
1239 | }
1240 | },
1241 | "node_modules/timers-browserify": {
1242 | "version": "2.0.12",
1243 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
1244 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
1245 | "dev": true,
1246 | "dependencies": {
1247 | "setimmediate": "^1.0.4"
1248 | },
1249 | "engines": {
1250 | "node": ">=0.6.0"
1251 | }
1252 | },
1253 | "node_modules/tinycolor2": {
1254 | "version": "1.4.2",
1255 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
1256 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==",
1257 | "engines": {
1258 | "node": "*"
1259 | }
1260 | },
1261 | "node_modules/to-arraybuffer": {
1262 | "version": "1.0.1",
1263 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
1264 | "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
1265 | "dev": true
1266 | },
1267 | "node_modules/tty-browserify": {
1268 | "version": "0.0.0",
1269 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
1270 | "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
1271 | "dev": true
1272 | },
1273 | "node_modules/url": {
1274 | "version": "0.11.0",
1275 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
1276 | "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
1277 | "dev": true,
1278 | "dependencies": {
1279 | "punycode": "1.3.2",
1280 | "querystring": "0.2.0"
1281 | }
1282 | },
1283 | "node_modules/url/node_modules/punycode": {
1284 | "version": "1.3.2",
1285 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
1286 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
1287 | "dev": true
1288 | },
1289 | "node_modules/util": {
1290 | "version": "0.11.1",
1291 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
1292 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
1293 | "dev": true,
1294 | "dependencies": {
1295 | "inherits": "2.0.3"
1296 | }
1297 | },
1298 | "node_modules/util-deprecate": {
1299 | "version": "1.0.2",
1300 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1301 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1302 | "dev": true
1303 | },
1304 | "node_modules/util/node_modules/inherits": {
1305 | "version": "2.0.3",
1306 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1307 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
1308 | "dev": true
1309 | },
1310 | "node_modules/vm-browserify": {
1311 | "version": "1.1.2",
1312 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
1313 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
1314 | "dev": true
1315 | },
1316 | "node_modules/which": {
1317 | "version": "1.3.1",
1318 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1319 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1320 | "dev": true,
1321 | "dependencies": {
1322 | "isexe": "^2.0.0"
1323 | },
1324 | "bin": {
1325 | "which": "bin/which"
1326 | }
1327 | },
1328 | "node_modules/ws": {
1329 | "version": "7.5.9",
1330 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
1331 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
1332 | "dev": true,
1333 | "engines": {
1334 | "node": ">=8.3.0"
1335 | },
1336 | "peerDependencies": {
1337 | "bufferutil": "^4.0.1",
1338 | "utf-8-validate": "^5.0.2"
1339 | },
1340 | "peerDependenciesMeta": {
1341 | "bufferutil": {
1342 | "optional": true
1343 | },
1344 | "utf-8-validate": {
1345 | "optional": true
1346 | }
1347 | }
1348 | },
1349 | "node_modules/xtend": {
1350 | "version": "4.0.2",
1351 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1352 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1353 | "dev": true,
1354 | "engines": {
1355 | "node": ">=0.4"
1356 | }
1357 | }
1358 | },
1359 | "dependencies": {
1360 | "@tweenjs/tween.js": {
1361 | "version": "18.6.4",
1362 | "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz",
1363 | "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ=="
1364 | },
1365 | "accessor-fn": {
1366 | "version": "1.3.2",
1367 | "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.3.2.tgz",
1368 | "integrity": "sha512-W4/Lj/gry8AHy+IC7Havr7fNbphHDzVAiZd5h10g8LRRz6ZKla3A1/lkFqoV1jh13R0eJLGWjDBlRGK36fcWiw=="
1369 | },
1370 | "asn1.js": {
1371 | "version": "5.4.1",
1372 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
1373 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
1374 | "dev": true,
1375 | "requires": {
1376 | "bn.js": "^4.0.0",
1377 | "inherits": "^2.0.1",
1378 | "minimalistic-assert": "^1.0.0",
1379 | "safer-buffer": "^2.1.0"
1380 | },
1381 | "dependencies": {
1382 | "bn.js": {
1383 | "version": "4.12.0",
1384 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1385 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
1386 | "dev": true
1387 | }
1388 | }
1389 | },
1390 | "assert": {
1391 | "version": "1.5.0",
1392 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
1393 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
1394 | "dev": true,
1395 | "requires": {
1396 | "object-assign": "^4.1.1",
1397 | "util": "0.10.3"
1398 | },
1399 | "dependencies": {
1400 | "inherits": {
1401 | "version": "2.0.1",
1402 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
1403 | "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
1404 | "dev": true
1405 | },
1406 | "util": {
1407 | "version": "0.10.3",
1408 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
1409 | "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==",
1410 | "dev": true,
1411 | "requires": {
1412 | "inherits": "2.0.1"
1413 | }
1414 | }
1415 | }
1416 | },
1417 | "base64-js": {
1418 | "version": "1.5.1",
1419 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
1420 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
1421 | "dev": true
1422 | },
1423 | "bezier-js": {
1424 | "version": "6.1.0",
1425 | "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.0.tgz",
1426 | "integrity": "sha512-oc8fkHqG0R+dQuNiXVbPMB0cc8iDqkLAjbA2gq26QmV8tZqW9GGI7iNEX1ioRWlZperQS7v5BX03+9FLVWZbSw=="
1427 | },
1428 | "bn.js": {
1429 | "version": "5.2.1",
1430 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
1431 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
1432 | "dev": true
1433 | },
1434 | "brorand": {
1435 | "version": "1.1.0",
1436 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
1437 | "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
1438 | "dev": true
1439 | },
1440 | "browserify-aes": {
1441 | "version": "1.2.0",
1442 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
1443 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
1444 | "dev": true,
1445 | "requires": {
1446 | "buffer-xor": "^1.0.3",
1447 | "cipher-base": "^1.0.0",
1448 | "create-hash": "^1.1.0",
1449 | "evp_bytestokey": "^1.0.3",
1450 | "inherits": "^2.0.1",
1451 | "safe-buffer": "^5.0.1"
1452 | }
1453 | },
1454 | "browserify-cipher": {
1455 | "version": "1.0.1",
1456 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
1457 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
1458 | "dev": true,
1459 | "requires": {
1460 | "browserify-aes": "^1.0.4",
1461 | "browserify-des": "^1.0.0",
1462 | "evp_bytestokey": "^1.0.0"
1463 | }
1464 | },
1465 | "browserify-des": {
1466 | "version": "1.0.2",
1467 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
1468 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
1469 | "dev": true,
1470 | "requires": {
1471 | "cipher-base": "^1.0.1",
1472 | "des.js": "^1.0.0",
1473 | "inherits": "^2.0.1",
1474 | "safe-buffer": "^5.1.2"
1475 | }
1476 | },
1477 | "browserify-rsa": {
1478 | "version": "4.1.0",
1479 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
1480 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
1481 | "dev": true,
1482 | "requires": {
1483 | "bn.js": "^5.0.0",
1484 | "randombytes": "^2.0.1"
1485 | }
1486 | },
1487 | "browserify-sign": {
1488 | "version": "4.2.1",
1489 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
1490 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
1491 | "dev": true,
1492 | "requires": {
1493 | "bn.js": "^5.1.1",
1494 | "browserify-rsa": "^4.0.1",
1495 | "create-hash": "^1.2.0",
1496 | "create-hmac": "^1.1.7",
1497 | "elliptic": "^6.5.3",
1498 | "inherits": "^2.0.4",
1499 | "parse-asn1": "^5.1.5",
1500 | "readable-stream": "^3.6.0",
1501 | "safe-buffer": "^5.2.0"
1502 | },
1503 | "dependencies": {
1504 | "readable-stream": {
1505 | "version": "3.6.0",
1506 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1507 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1508 | "dev": true,
1509 | "requires": {
1510 | "inherits": "^2.0.3",
1511 | "string_decoder": "^1.1.1",
1512 | "util-deprecate": "^1.0.1"
1513 | }
1514 | }
1515 | }
1516 | },
1517 | "browserify-zlib": {
1518 | "version": "0.2.0",
1519 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
1520 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
1521 | "dev": true,
1522 | "requires": {
1523 | "pako": "~1.0.5"
1524 | }
1525 | },
1526 | "buffer": {
1527 | "version": "4.9.2",
1528 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
1529 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
1530 | "dev": true,
1531 | "requires": {
1532 | "base64-js": "^1.0.2",
1533 | "ieee754": "^1.1.4",
1534 | "isarray": "^1.0.0"
1535 | }
1536 | },
1537 | "buffer-xor": {
1538 | "version": "1.0.3",
1539 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
1540 | "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
1541 | "dev": true
1542 | },
1543 | "builtin-status-codes": {
1544 | "version": "3.0.0",
1545 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
1546 | "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
1547 | "dev": true
1548 | },
1549 | "canvas-color-tracker": {
1550 | "version": "1.1.6",
1551 | "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.1.6.tgz",
1552 | "integrity": "sha512-LpKiona7TwN0rpLgGcdvAw/HVV9HGCSSyOoSJkLyUP+VZmTX2uAnunGVoKrEHQ/7i+lyu6HfazdHV93vLrjK5Q==",
1553 | "requires": {
1554 | "tinycolor2": "^1.4.2"
1555 | }
1556 | },
1557 | "cipher-base": {
1558 | "version": "1.0.4",
1559 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
1560 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
1561 | "dev": true,
1562 | "requires": {
1563 | "inherits": "^2.0.1",
1564 | "safe-buffer": "^5.0.1"
1565 | }
1566 | },
1567 | "console-browserify": {
1568 | "version": "1.2.0",
1569 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
1570 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
1571 | "dev": true
1572 | },
1573 | "constants-browserify": {
1574 | "version": "1.0.0",
1575 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
1576 | "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
1577 | "dev": true
1578 | },
1579 | "core-util-is": {
1580 | "version": "1.0.3",
1581 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
1582 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
1583 | "dev": true
1584 | },
1585 | "create-ecdh": {
1586 | "version": "4.0.4",
1587 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
1588 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
1589 | "dev": true,
1590 | "requires": {
1591 | "bn.js": "^4.1.0",
1592 | "elliptic": "^6.5.3"
1593 | },
1594 | "dependencies": {
1595 | "bn.js": {
1596 | "version": "4.12.0",
1597 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1598 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
1599 | "dev": true
1600 | }
1601 | }
1602 | },
1603 | "create-hash": {
1604 | "version": "1.2.0",
1605 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
1606 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
1607 | "dev": true,
1608 | "requires": {
1609 | "cipher-base": "^1.0.1",
1610 | "inherits": "^2.0.1",
1611 | "md5.js": "^1.3.4",
1612 | "ripemd160": "^2.0.1",
1613 | "sha.js": "^2.4.0"
1614 | }
1615 | },
1616 | "create-hmac": {
1617 | "version": "1.1.7",
1618 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
1619 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
1620 | "dev": true,
1621 | "requires": {
1622 | "cipher-base": "^1.0.3",
1623 | "create-hash": "^1.1.0",
1624 | "inherits": "^2.0.1",
1625 | "ripemd160": "^2.0.0",
1626 | "safe-buffer": "^5.0.1",
1627 | "sha.js": "^2.4.8"
1628 | }
1629 | },
1630 | "crypto-browserify": {
1631 | "version": "3.12.0",
1632 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
1633 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
1634 | "dev": true,
1635 | "requires": {
1636 | "browserify-cipher": "^1.0.0",
1637 | "browserify-sign": "^4.0.0",
1638 | "create-ecdh": "^4.0.0",
1639 | "create-hash": "^1.1.0",
1640 | "create-hmac": "^1.1.0",
1641 | "diffie-hellman": "^5.0.0",
1642 | "inherits": "^2.0.1",
1643 | "pbkdf2": "^3.0.3",
1644 | "public-encrypt": "^4.0.0",
1645 | "randombytes": "^2.0.0",
1646 | "randomfill": "^1.0.3"
1647 | }
1648 | },
1649 | "d3-array": {
1650 | "version": "3.2.0",
1651 | "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
1652 | "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
1653 | "requires": {
1654 | "internmap": "1 - 2"
1655 | }
1656 | },
1657 | "d3-binarytree": {
1658 | "version": "0.2.2",
1659 | "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-0.2.2.tgz",
1660 | "integrity": "sha512-TmgSEKWO4lSjX26Rk77hbTdiF3TQ1v5LqL+cmSz6/5RiSxmq6+e6qHE6X/KwrsIESekhEReH63X5yM8dvXaT7A=="
1661 | },
1662 | "d3-color": {
1663 | "version": "3.1.0",
1664 | "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
1665 | "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
1666 | },
1667 | "d3-dispatch": {
1668 | "version": "3.0.1",
1669 | "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
1670 | "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
1671 | },
1672 | "d3-drag": {
1673 | "version": "3.0.0",
1674 | "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
1675 | "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
1676 | "requires": {
1677 | "d3-dispatch": "1 - 3",
1678 | "d3-selection": "3"
1679 | }
1680 | },
1681 | "d3-ease": {
1682 | "version": "3.0.1",
1683 | "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
1684 | "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
1685 | },
1686 | "d3-force-3d": {
1687 | "version": "3.0.3",
1688 | "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.3.tgz",
1689 | "integrity": "sha512-8HGTbw6y35UYManGCPU4+b9/PGgnyjzRq80DRsp7zFsRl0leVz2pzwx18dwkPe4rDxTOEpM4BuWQ2krbVaGQQA==",
1690 | "requires": {
1691 | "d3-binarytree": "^0.2.0",
1692 | "d3-dispatch": "1 - 3",
1693 | "d3-octree": "^0.2.0",
1694 | "d3-quadtree": "1 - 3",
1695 | "d3-timer": "1 - 3"
1696 | }
1697 | },
1698 | "d3-format": {
1699 | "version": "3.1.0",
1700 | "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
1701 | "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
1702 | },
1703 | "d3-interpolate": {
1704 | "version": "3.0.1",
1705 | "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
1706 | "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
1707 | "requires": {
1708 | "d3-color": "1 - 3"
1709 | }
1710 | },
1711 | "d3-octree": {
1712 | "version": "0.2.2",
1713 | "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-0.2.2.tgz",
1714 | "integrity": "sha512-ysk9uSPAhZVb0Gq4GXzghl/Yqxu80dHrq55I53qaIMdGB65+0UfO84sr4Fci2JHumcgh6H4WE0r8LwxPagkE+g=="
1715 | },
1716 | "d3-quadtree": {
1717 | "version": "3.0.1",
1718 | "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
1719 | "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="
1720 | },
1721 | "d3-scale": {
1722 | "version": "4.0.2",
1723 | "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
1724 | "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
1725 | "requires": {
1726 | "d3-array": "2.10.0 - 3",
1727 | "d3-format": "1 - 3",
1728 | "d3-interpolate": "1.2.0 - 3",
1729 | "d3-time": "2.1.1 - 3",
1730 | "d3-time-format": "2 - 4"
1731 | }
1732 | },
1733 | "d3-scale-chromatic": {
1734 | "version": "3.0.0",
1735 | "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
1736 | "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
1737 | "requires": {
1738 | "d3-color": "1 - 3",
1739 | "d3-interpolate": "1 - 3"
1740 | }
1741 | },
1742 | "d3-selection": {
1743 | "version": "3.0.0",
1744 | "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
1745 | "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="
1746 | },
1747 | "d3-time": {
1748 | "version": "3.0.0",
1749 | "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
1750 | "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
1751 | "requires": {
1752 | "d3-array": "2 - 3"
1753 | }
1754 | },
1755 | "d3-time-format": {
1756 | "version": "4.1.0",
1757 | "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
1758 | "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
1759 | "requires": {
1760 | "d3-time": "1 - 3"
1761 | }
1762 | },
1763 | "d3-timer": {
1764 | "version": "3.0.1",
1765 | "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
1766 | "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
1767 | },
1768 | "d3-transition": {
1769 | "version": "3.0.1",
1770 | "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
1771 | "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
1772 | "requires": {
1773 | "d3-color": "1 - 3",
1774 | "d3-dispatch": "1 - 3",
1775 | "d3-ease": "1 - 3",
1776 | "d3-interpolate": "1 - 3",
1777 | "d3-timer": "1 - 3"
1778 | }
1779 | },
1780 | "d3-zoom": {
1781 | "version": "3.0.0",
1782 | "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
1783 | "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
1784 | "requires": {
1785 | "d3-dispatch": "1 - 3",
1786 | "d3-drag": "2 - 3",
1787 | "d3-interpolate": "1 - 3",
1788 | "d3-selection": "2 - 3",
1789 | "d3-transition": "2 - 3"
1790 | }
1791 | },
1792 | "debounce": {
1793 | "version": "1.2.1",
1794 | "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
1795 | "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
1796 | },
1797 | "des.js": {
1798 | "version": "1.0.1",
1799 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
1800 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
1801 | "dev": true,
1802 | "requires": {
1803 | "inherits": "^2.0.1",
1804 | "minimalistic-assert": "^1.0.0"
1805 | }
1806 | },
1807 | "diffie-hellman": {
1808 | "version": "5.0.3",
1809 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
1810 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
1811 | "dev": true,
1812 | "requires": {
1813 | "bn.js": "^4.1.0",
1814 | "miller-rabin": "^4.0.0",
1815 | "randombytes": "^2.0.0"
1816 | },
1817 | "dependencies": {
1818 | "bn.js": {
1819 | "version": "4.12.0",
1820 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1821 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
1822 | "dev": true
1823 | }
1824 | }
1825 | },
1826 | "domain-browser": {
1827 | "version": "1.2.0",
1828 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
1829 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
1830 | "dev": true
1831 | },
1832 | "elliptic": {
1833 | "version": "6.5.4",
1834 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
1835 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
1836 | "dev": true,
1837 | "requires": {
1838 | "bn.js": "^4.11.9",
1839 | "brorand": "^1.1.0",
1840 | "hash.js": "^1.0.0",
1841 | "hmac-drbg": "^1.0.1",
1842 | "inherits": "^2.0.4",
1843 | "minimalistic-assert": "^1.0.1",
1844 | "minimalistic-crypto-utils": "^1.0.1"
1845 | },
1846 | "dependencies": {
1847 | "bn.js": {
1848 | "version": "4.12.0",
1849 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
1850 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
1851 | "dev": true
1852 | }
1853 | }
1854 | },
1855 | "events": {
1856 | "version": "3.3.0",
1857 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
1858 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
1859 | "dev": true
1860 | },
1861 | "evp_bytestokey": {
1862 | "version": "1.0.3",
1863 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
1864 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
1865 | "dev": true,
1866 | "requires": {
1867 | "md5.js": "^1.3.4",
1868 | "safe-buffer": "^5.1.1"
1869 | }
1870 | },
1871 | "force-graph": {
1872 | "version": "1.42.16",
1873 | "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.42.16.tgz",
1874 | "integrity": "sha512-ypgtQHOZCPDTB1nVB5k1CpEdaqjCzuLpNKd9msuoLwisBQtXE1V11PDLIza7Y06C3mPAHc+dl49GyQi8V1SR5w==",
1875 | "requires": {
1876 | "@tweenjs/tween.js": "18",
1877 | "accessor-fn": "1",
1878 | "bezier-js": "3 - 6",
1879 | "canvas-color-tracker": "1",
1880 | "d3-array": "1 - 3",
1881 | "d3-drag": "2 - 3",
1882 | "d3-force-3d": "2 - 3",
1883 | "d3-scale": "1 - 4",
1884 | "d3-scale-chromatic": "1 - 3",
1885 | "d3-selection": "2 - 3",
1886 | "d3-zoom": "2 - 3",
1887 | "index-array-by": "1",
1888 | "kapsule": "^1.13",
1889 | "lodash.throttle": "4"
1890 | }
1891 | },
1892 | "fromentries": {
1893 | "version": "1.3.2",
1894 | "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
1895 | "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg=="
1896 | },
1897 | "hash-base": {
1898 | "version": "3.1.0",
1899 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
1900 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
1901 | "dev": true,
1902 | "requires": {
1903 | "inherits": "^2.0.4",
1904 | "readable-stream": "^3.6.0",
1905 | "safe-buffer": "^5.2.0"
1906 | },
1907 | "dependencies": {
1908 | "readable-stream": {
1909 | "version": "3.6.0",
1910 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1911 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1912 | "dev": true,
1913 | "requires": {
1914 | "inherits": "^2.0.3",
1915 | "string_decoder": "^1.1.1",
1916 | "util-deprecate": "^1.0.1"
1917 | }
1918 | }
1919 | }
1920 | },
1921 | "hash.js": {
1922 | "version": "1.1.7",
1923 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
1924 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
1925 | "dev": true,
1926 | "requires": {
1927 | "inherits": "^2.0.3",
1928 | "minimalistic-assert": "^1.0.1"
1929 | }
1930 | },
1931 | "highlight.js": {
1932 | "version": "11.5.1",
1933 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz",
1934 | "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q=="
1935 | },
1936 | "hmac-drbg": {
1937 | "version": "1.0.1",
1938 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
1939 | "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
1940 | "dev": true,
1941 | "requires": {
1942 | "hash.js": "^1.0.3",
1943 | "minimalistic-assert": "^1.0.0",
1944 | "minimalistic-crypto-utils": "^1.0.1"
1945 | }
1946 | },
1947 | "https-browserify": {
1948 | "version": "1.0.0",
1949 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
1950 | "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
1951 | "dev": true
1952 | },
1953 | "ieee754": {
1954 | "version": "1.2.1",
1955 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1956 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
1957 | "dev": true
1958 | },
1959 | "index-array-by": {
1960 | "version": "1.3.3",
1961 | "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.3.3.tgz",
1962 | "integrity": "sha512-dpqV1sX+hx4s0RqAT97ypk9xzcAXJ0XK27p3bTgPy8bjbJAX6Kf7RU3pPXgmg9hhO7f5/WxO354v2f/A0/fz3Q=="
1963 | },
1964 | "inherits": {
1965 | "version": "2.0.4",
1966 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1967 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1968 | "dev": true
1969 | },
1970 | "internmap": {
1971 | "version": "2.0.3",
1972 | "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
1973 | "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
1974 | },
1975 | "isarray": {
1976 | "version": "1.0.0",
1977 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1978 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
1979 | "dev": true
1980 | },
1981 | "isexe": {
1982 | "version": "2.0.0",
1983 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1984 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1985 | "dev": true
1986 | },
1987 | "jerrypick": {
1988 | "version": "1.0.5",
1989 | "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.0.5.tgz",
1990 | "integrity": "sha512-95dIyL2QXqevDDJ70rmiqKLsTi+riZftLQo708tSFR/O5pQOf6VscDhjnN8mkNQwqnQmGhw+6dfZ5d4bmH/yww=="
1991 | },
1992 | "js-tokens": {
1993 | "version": "4.0.0",
1994 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1995 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1996 | },
1997 | "kapsule": {
1998 | "version": "1.13.8",
1999 | "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.13.8.tgz",
2000 | "integrity": "sha512-Y1lLt1htHNofIM5kxS5OdEqDm7WFqHF4hm6DrrvNEKIJugfQrxDBycV41QI5FpnBGHqyBD99VpTB5ARnlufP6w==",
2001 | "requires": {
2002 | "debounce": "^1.2.1"
2003 | }
2004 | },
2005 | "lodash.throttle": {
2006 | "version": "4.1.1",
2007 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
2008 | "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
2009 | },
2010 | "loose-envify": {
2011 | "version": "1.4.0",
2012 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
2013 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2014 | "requires": {
2015 | "js-tokens": "^3.0.0 || ^4.0.0"
2016 | }
2017 | },
2018 | "md5.js": {
2019 | "version": "1.3.5",
2020 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
2021 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
2022 | "dev": true,
2023 | "requires": {
2024 | "hash-base": "^3.0.0",
2025 | "inherits": "^2.0.1",
2026 | "safe-buffer": "^5.1.2"
2027 | }
2028 | },
2029 | "miller-rabin": {
2030 | "version": "4.0.1",
2031 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
2032 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
2033 | "dev": true,
2034 | "requires": {
2035 | "bn.js": "^4.0.0",
2036 | "brorand": "^1.0.1"
2037 | },
2038 | "dependencies": {
2039 | "bn.js": {
2040 | "version": "4.12.0",
2041 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
2042 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
2043 | "dev": true
2044 | }
2045 | }
2046 | },
2047 | "minimalistic-assert": {
2048 | "version": "1.0.1",
2049 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
2050 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
2051 | "dev": true
2052 | },
2053 | "minimalistic-crypto-utils": {
2054 | "version": "1.0.1",
2055 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
2056 | "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
2057 | "dev": true
2058 | },
2059 | "node-libs-browser": {
2060 | "version": "2.2.1",
2061 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
2062 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
2063 | "dev": true,
2064 | "requires": {
2065 | "assert": "^1.1.1",
2066 | "browserify-zlib": "^0.2.0",
2067 | "buffer": "^4.3.0",
2068 | "console-browserify": "^1.1.0",
2069 | "constants-browserify": "^1.0.0",
2070 | "crypto-browserify": "^3.11.0",
2071 | "domain-browser": "^1.1.1",
2072 | "events": "^3.0.0",
2073 | "https-browserify": "^1.0.0",
2074 | "os-browserify": "^0.3.0",
2075 | "path-browserify": "0.0.1",
2076 | "process": "^0.11.10",
2077 | "punycode": "^1.2.4",
2078 | "querystring-es3": "^0.2.0",
2079 | "readable-stream": "^2.3.3",
2080 | "stream-browserify": "^2.0.1",
2081 | "stream-http": "^2.7.2",
2082 | "string_decoder": "^1.0.0",
2083 | "timers-browserify": "^2.0.4",
2084 | "tty-browserify": "0.0.0",
2085 | "url": "^0.11.0",
2086 | "util": "^0.11.0",
2087 | "vm-browserify": "^1.0.1"
2088 | }
2089 | },
2090 | "object-assign": {
2091 | "version": "4.1.1",
2092 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2093 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
2094 | },
2095 | "os-browserify": {
2096 | "version": "0.3.0",
2097 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
2098 | "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
2099 | "dev": true
2100 | },
2101 | "pako": {
2102 | "version": "1.0.11",
2103 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
2104 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
2105 | "dev": true
2106 | },
2107 | "parse-asn1": {
2108 | "version": "5.1.6",
2109 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
2110 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
2111 | "dev": true,
2112 | "requires": {
2113 | "asn1.js": "^5.2.0",
2114 | "browserify-aes": "^1.0.0",
2115 | "evp_bytestokey": "^1.0.0",
2116 | "pbkdf2": "^3.0.3",
2117 | "safe-buffer": "^5.1.1"
2118 | }
2119 | },
2120 | "path-browserify": {
2121 | "version": "0.0.1",
2122 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
2123 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
2124 | "dev": true
2125 | },
2126 | "pbkdf2": {
2127 | "version": "3.1.2",
2128 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
2129 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
2130 | "dev": true,
2131 | "requires": {
2132 | "create-hash": "^1.1.2",
2133 | "create-hmac": "^1.1.4",
2134 | "ripemd160": "^2.0.1",
2135 | "safe-buffer": "^5.0.1",
2136 | "sha.js": "^2.4.8"
2137 | }
2138 | },
2139 | "process": {
2140 | "version": "0.11.10",
2141 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
2142 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
2143 | "dev": true
2144 | },
2145 | "process-nextick-args": {
2146 | "version": "2.0.1",
2147 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2148 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
2149 | "dev": true
2150 | },
2151 | "prop-types": {
2152 | "version": "15.8.1",
2153 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2154 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2155 | "requires": {
2156 | "loose-envify": "^1.4.0",
2157 | "object-assign": "^4.1.1",
2158 | "react-is": "^16.13.1"
2159 | }
2160 | },
2161 | "public-encrypt": {
2162 | "version": "4.0.3",
2163 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
2164 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
2165 | "dev": true,
2166 | "requires": {
2167 | "bn.js": "^4.1.0",
2168 | "browserify-rsa": "^4.0.0",
2169 | "create-hash": "^1.1.0",
2170 | "parse-asn1": "^5.0.0",
2171 | "randombytes": "^2.0.1",
2172 | "safe-buffer": "^5.1.2"
2173 | },
2174 | "dependencies": {
2175 | "bn.js": {
2176 | "version": "4.12.0",
2177 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
2178 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
2179 | "dev": true
2180 | }
2181 | }
2182 | },
2183 | "punycode": {
2184 | "version": "1.4.1",
2185 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
2186 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
2187 | "dev": true
2188 | },
2189 | "querystring": {
2190 | "version": "0.2.0",
2191 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
2192 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
2193 | "dev": true
2194 | },
2195 | "querystring-es3": {
2196 | "version": "0.2.1",
2197 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
2198 | "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
2199 | "dev": true
2200 | },
2201 | "randombytes": {
2202 | "version": "2.1.0",
2203 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2204 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2205 | "dev": true,
2206 | "requires": {
2207 | "safe-buffer": "^5.1.0"
2208 | }
2209 | },
2210 | "randomfill": {
2211 | "version": "1.0.4",
2212 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
2213 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
2214 | "dev": true,
2215 | "requires": {
2216 | "randombytes": "^2.0.5",
2217 | "safe-buffer": "^5.1.0"
2218 | }
2219 | },
2220 | "react": {
2221 | "version": "17.0.2",
2222 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
2223 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
2224 | "requires": {
2225 | "loose-envify": "^1.1.0",
2226 | "object-assign": "^4.1.1"
2227 | }
2228 | },
2229 | "react-dom": {
2230 | "version": "17.0.2",
2231 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
2232 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
2233 | "requires": {
2234 | "loose-envify": "^1.1.0",
2235 | "object-assign": "^4.1.1",
2236 | "scheduler": "^0.20.2"
2237 | }
2238 | },
2239 | "react-force-graph-2d": {
2240 | "version": "1.23.13",
2241 | "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.23.13.tgz",
2242 | "integrity": "sha512-mdw9r5Ob4yCYaWHSqFmO9lUtZq4ERZSBo+CIO7CD7d13PNrjNI/lVIBCsR/elj6f1AzQ9vqyrAUIsE+5BlaLkw==",
2243 | "requires": {
2244 | "force-graph": "^1.42",
2245 | "prop-types": "^15.8",
2246 | "react-kapsule": "^2.2"
2247 | }
2248 | },
2249 | "react-is": {
2250 | "version": "16.13.1",
2251 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2252 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
2253 | },
2254 | "react-kapsule": {
2255 | "version": "2.2.6",
2256 | "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.2.6.tgz",
2257 | "integrity": "sha512-OUfvKeXSwpwVcGhyUWK6XaStEAA/KWFvlRAo/maS+GWhp7X0mSMbuZ/5jBACXhTFNGqWHf5yyt+LURiWA77HfA==",
2258 | "requires": {
2259 | "fromentries": "^1.3.2",
2260 | "jerrypick": "^1.0.5"
2261 | }
2262 | },
2263 | "readable-stream": {
2264 | "version": "2.3.7",
2265 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
2266 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
2267 | "dev": true,
2268 | "requires": {
2269 | "core-util-is": "~1.0.0",
2270 | "inherits": "~2.0.3",
2271 | "isarray": "~1.0.0",
2272 | "process-nextick-args": "~2.0.0",
2273 | "safe-buffer": "~5.1.1",
2274 | "string_decoder": "~1.1.1",
2275 | "util-deprecate": "~1.0.1"
2276 | },
2277 | "dependencies": {
2278 | "safe-buffer": {
2279 | "version": "5.1.2",
2280 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2281 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2282 | "dev": true
2283 | },
2284 | "string_decoder": {
2285 | "version": "1.1.1",
2286 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2287 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2288 | "dev": true,
2289 | "requires": {
2290 | "safe-buffer": "~5.1.0"
2291 | }
2292 | }
2293 | }
2294 | },
2295 | "readline-sync": {
2296 | "version": "1.4.10",
2297 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
2298 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
2299 | "dev": true
2300 | },
2301 | "ripemd160": {
2302 | "version": "2.0.2",
2303 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
2304 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
2305 | "dev": true,
2306 | "requires": {
2307 | "hash-base": "^3.0.0",
2308 | "inherits": "^2.0.1"
2309 | }
2310 | },
2311 | "safe-buffer": {
2312 | "version": "5.2.1",
2313 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2314 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
2315 | "dev": true
2316 | },
2317 | "safer-buffer": {
2318 | "version": "2.1.2",
2319 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2320 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2321 | "dev": true
2322 | },
2323 | "scheduler": {
2324 | "version": "0.20.2",
2325 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
2326 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
2327 | "requires": {
2328 | "loose-envify": "^1.1.0",
2329 | "object-assign": "^4.1.1"
2330 | }
2331 | },
2332 | "setimmediate": {
2333 | "version": "1.0.5",
2334 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
2335 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
2336 | "dev": true
2337 | },
2338 | "sha.js": {
2339 | "version": "2.4.11",
2340 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
2341 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
2342 | "dev": true,
2343 | "requires": {
2344 | "inherits": "^2.0.1",
2345 | "safe-buffer": "^5.0.1"
2346 | }
2347 | },
2348 | "shadow-cljs": {
2349 | "version": "2.20.1",
2350 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.20.1.tgz",
2351 | "integrity": "sha512-hzx3noRw200I4H9f1b1WX61chRUOuGNZCiDkuM/4s+6dxKseS01FFScqOoe7UXwJFff/omoU9rGzh4R9oXtD+A==",
2352 | "dev": true,
2353 | "requires": {
2354 | "node-libs-browser": "^2.2.1",
2355 | "readline-sync": "^1.4.7",
2356 | "shadow-cljs-jar": "1.3.2",
2357 | "source-map-support": "^0.4.15",
2358 | "which": "^1.3.1",
2359 | "ws": "^7.4.6"
2360 | }
2361 | },
2362 | "shadow-cljs-jar": {
2363 | "version": "1.3.2",
2364 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz",
2365 | "integrity": "sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg==",
2366 | "dev": true
2367 | },
2368 | "source-map": {
2369 | "version": "0.5.7",
2370 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2371 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
2372 | "dev": true
2373 | },
2374 | "source-map-support": {
2375 | "version": "0.4.18",
2376 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
2377 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
2378 | "dev": true,
2379 | "requires": {
2380 | "source-map": "^0.5.6"
2381 | }
2382 | },
2383 | "stream-browserify": {
2384 | "version": "2.0.2",
2385 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
2386 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
2387 | "dev": true,
2388 | "requires": {
2389 | "inherits": "~2.0.1",
2390 | "readable-stream": "^2.0.2"
2391 | }
2392 | },
2393 | "stream-http": {
2394 | "version": "2.8.3",
2395 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
2396 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
2397 | "dev": true,
2398 | "requires": {
2399 | "builtin-status-codes": "^3.0.0",
2400 | "inherits": "^2.0.1",
2401 | "readable-stream": "^2.3.6",
2402 | "to-arraybuffer": "^1.0.0",
2403 | "xtend": "^4.0.0"
2404 | }
2405 | },
2406 | "string_decoder": {
2407 | "version": "1.3.0",
2408 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2409 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2410 | "dev": true,
2411 | "requires": {
2412 | "safe-buffer": "~5.2.0"
2413 | }
2414 | },
2415 | "timers-browserify": {
2416 | "version": "2.0.12",
2417 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
2418 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
2419 | "dev": true,
2420 | "requires": {
2421 | "setimmediate": "^1.0.4"
2422 | }
2423 | },
2424 | "tinycolor2": {
2425 | "version": "1.4.2",
2426 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
2427 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
2428 | },
2429 | "to-arraybuffer": {
2430 | "version": "1.0.1",
2431 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
2432 | "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
2433 | "dev": true
2434 | },
2435 | "tty-browserify": {
2436 | "version": "0.0.0",
2437 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
2438 | "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
2439 | "dev": true
2440 | },
2441 | "url": {
2442 | "version": "0.11.0",
2443 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
2444 | "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
2445 | "dev": true,
2446 | "requires": {
2447 | "punycode": "1.3.2",
2448 | "querystring": "0.2.0"
2449 | },
2450 | "dependencies": {
2451 | "punycode": {
2452 | "version": "1.3.2",
2453 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
2454 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
2455 | "dev": true
2456 | }
2457 | }
2458 | },
2459 | "util": {
2460 | "version": "0.11.1",
2461 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
2462 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
2463 | "dev": true,
2464 | "requires": {
2465 | "inherits": "2.0.3"
2466 | },
2467 | "dependencies": {
2468 | "inherits": {
2469 | "version": "2.0.3",
2470 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2471 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
2472 | "dev": true
2473 | }
2474 | }
2475 | },
2476 | "util-deprecate": {
2477 | "version": "1.0.2",
2478 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2479 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2480 | "dev": true
2481 | },
2482 | "vm-browserify": {
2483 | "version": "1.1.2",
2484 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
2485 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
2486 | "dev": true
2487 | },
2488 | "which": {
2489 | "version": "1.3.1",
2490 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2491 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2492 | "dev": true,
2493 | "requires": {
2494 | "isexe": "^2.0.0"
2495 | }
2496 | },
2497 | "ws": {
2498 | "version": "7.5.9",
2499 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
2500 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
2501 | "dev": true,
2502 | "requires": {}
2503 | },
2504 | "xtend": {
2505 | "version": "4.0.2",
2506 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2507 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
2508 | "dev": true
2509 | }
2510 | }
2511 | }
2512 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "arena-graph",
3 | "scripts": {
4 | "ancient": "clojure -Sdeps '{:deps {com.github.liquidz/antq {:mvn/version \"RELEASE\"}}}' -m antq.core",
5 | "watch": "npx shadow-cljs watch app browser-test karma-test",
6 | "release": "npx shadow-cljs release app",
7 | "build-report": "npx shadow-cljs run shadow.cljs.build-report app target/build-report.html"
8 | },
9 | "dependencies": {
10 | "highlight.js": "11.5.1",
11 | "react": "17.0.2",
12 | "react-dom": "17.0.2",
13 | "react-force-graph-2d": "^1.23.11"
14 | },
15 | "devDependencies": {
16 | "shadow-cljs": "2.20.1"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/resources/public/_asset/UniVGA16.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/UniVGA16.ttf
--------------------------------------------------------------------------------
/resources/public/_asset/gif/planet.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/planet.gif
--------------------------------------------------------------------------------
/resources/public/_asset/gif/ripples.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/ripples.gif
--------------------------------------------------------------------------------
/resources/public/_asset/gif/scroll.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/scroll.gif
--------------------------------------------------------------------------------
/resources/public/_asset/gif/sparkle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/sparkle.gif
--------------------------------------------------------------------------------
/resources/public/_asset/gif/takase.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/takase.gif
--------------------------------------------------------------------------------
/resources/public/_asset/gif/tan.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/gif/tan.gif
--------------------------------------------------------------------------------
/resources/public/_asset/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/_asset/logo.png
--------------------------------------------------------------------------------
/resources/public/_asset/svg/arena-inv.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_asset/svg/arena.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_asset/svg/close.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_asset/svg/github-inv.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_asset/svg/github.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_asset/svg/power-inv.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_asset/svg/power.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/resources/public/_css/base.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: "VGA";
3 | src: url("../_asset/UniVGA16.ttf");
4 | }
5 |
6 | :root {
7 | --ui: #F6CA18;
8 | --bg: #180906;
9 | }
10 |
11 | /* ========== SETUP ========================================================= */
12 | /* Reset headings */
13 | h1, h2, h3, h4, h5, h6 {
14 | font-weight: normal;
15 | line-height: normal;
16 | font-size: initial;
17 | margin-block: 0 0;
18 | margin-inline: 0 0;
19 | display: initial;
20 | }
21 |
22 | /* Reset list */
23 | ul {
24 | list-style-type: none;
25 | margin-block: 0 0;
26 | padding-inline: 0 0;
27 | }
28 |
29 | /* Remove form styles */
30 | input, button {
31 | all: unset;
32 | }
33 |
34 | .displayed {
35 | display: initial !important;
36 | }
37 |
38 | .visible {
39 | visibility: visible !important;
40 | }
41 |
42 | /* ========== PAGE-WIDE CHANGES ============================================= */
43 | html {
44 | background-color: var(--bg);
45 | color: var(--ui);
46 | font-family: "VGA", monospace;
47 | image-rendering: pixelated;
48 | }
49 |
50 | body {
51 | display: grid;
52 | height: 100vh;
53 | place-content: center;
54 | padding: 0 1rem;
55 | }
56 |
57 | h1 {
58 | font-size: 1.2rem;
59 | }
60 |
61 | /* ========== SECTION ELEMENTS ============================================== */
62 | main {
63 | display: flex;
64 | flex-flow: column nowrap;
65 | border: 3px solid var(--ui);
66 | }
67 |
68 | header {
69 | padding: 0.2rem 0.25rem 0.2rem 1.3rem;
70 | background-color: var(--ui);
71 | color: var(--bg);
72 | display: flex;
73 | flex-flow: row nowrap;
74 | justify-content: space-between;
75 | }
76 |
77 | /* ========== MAIN UI ======================================================= */
78 | #container {
79 | display: flex;
80 | flex-flow: row wrap-reverse;
81 | align-content: center;
82 | justify-content: center;
83 | background: var(--ui);
84 | }
85 |
86 | #canvas-container {
87 | display: grid;
88 | grid-template-rows: 1fr;
89 | overflow: hidden;
90 | }
91 |
92 | #canvas-cover {
93 | grid-area: 1 / 1;
94 | z-index: 2;
95 | background-color: var(--ui);
96 | transform: translateY(-100%);
97 | transition: transform 0.35s ease-in;
98 | padding: 0.2rem;
99 | }
100 | #canvas-cover > div {
101 | width: 100%;
102 | height: 100%;
103 | display: grid;
104 | place-content: center;
105 | border: 1px solid var(--bg);
106 | }
107 |
108 | .canvas-covered {
109 | transform: translateY(0) !important;
110 | }
111 |
112 | #canvas {
113 | grid-area: 1 / 1;
114 | border: 1px solid var(--ui);
115 | background: var(--bg);
116 | }
117 |
118 | nav {
119 | display: flex;
120 | flex-flow: row nowrap;
121 | gap: 0.3rem;
122 | }
123 |
124 | nav span {
125 | background-color: var(--ui);
126 | max-height: 20px;
127 | }
128 |
129 | .nav-button {
130 | display: block;
131 | background-size: contain;
132 | cursor: pointer;
133 | padding: 1px;
134 | border-radius: 2px;
135 | }
136 | .nav-button div {
137 | padding: 2px;
138 | width: 16px;
139 | height: 16px;
140 | border-radius: 2px;
141 | }
142 | .nav-button:hover {
143 | outline: 1px solid var(--bg);
144 | }
145 | .nav-button:active {
146 | outline: unset;
147 | background-color: var(--bg);
148 | }
149 | #close {
150 | background-image: url("../_asset/svg/power-inv.svg");
151 | }
152 | #github {
153 | background-image: url("../_asset/svg/github-inv.svg");
154 | }
155 | #arena {
156 | background-image: url("../_asset/svg/arena-inv.svg");
157 | }
158 |
159 | #close:active {
160 | background-image: url("../_asset/svg/power.svg");
161 | }
162 | #github:active {
163 | background-image: url("../_asset/svg/github.svg");
164 | }
165 | #arena:active {
166 | background-image: url("../_asset/svg/arena.svg");
167 | }
168 |
169 | /* ========== CONSOLE ======================================================= */
170 | #console {
171 | grid-area: 1 / 1;
172 | }
173 |
174 | #console ul {
175 | display: flex;
176 | flex-flow: column-reverse nowrap;
177 | height: 7rem;
178 | padding-top: 0.5rem;
179 | border: 1px solid var(--ui);
180 | overflow: scroll;
181 | gap: 0.1rem;
182 | line-height: 1.1;
183 | }
184 |
185 | #console li {
186 | display: flex;
187 | flex-flow: row nowrap;
188 | padding: 0.1rem 0.3rem 0;
189 | gap: 0.5rem;
190 | }
191 |
192 | #typing {
193 | display: none;
194 | animation: blink 0.8s step-start infinite;
195 | font-size: 1.1rem;
196 | line-height: 1.1rem;
197 | margin-bottom: 0.2rem;
198 | }
199 |
200 | @keyframes blink {
201 | 0% {
202 | opacity: 0;
203 | }
204 | 50% {
205 | opacity: 0;
206 | }
207 | }
208 |
209 | #console aside {
210 | filter: brightness(0.6) saturate(0.55);
211 | }
212 |
213 | #console .error {
214 | background: var(--ui);
215 | color: var(--bg);
216 | }
217 |
218 | #console .info aside {
219 | filter: none;
220 | }
221 | #console .info {
222 | filter: brightness(0.6) saturate(0.55);
223 | }
224 |
225 | /* ========== CONTROLS ====================================================== */
226 | #input-container {
227 | display: grid;
228 | grid-template-rows: 1fr;
229 | overflow: hidden;
230 | }
231 |
232 | #controls {
233 | grid-area: 1 / 1;
234 | border: 2px solid var(--ui);
235 | }
236 |
237 | #controls span::before {
238 | content: ">";
239 | margin: 0 0.3rem 0 0.5rem;
240 | }
241 | #controls span {
242 | display: flex;
243 | flex-flow: row nowrap;
244 | font-size: 1.1rem;
245 | }
246 |
247 | #controls span input {
248 | flex: 1;
249 | margin-right: 0.75rem;
250 | }
251 |
252 | #controls button {
253 | padding: 0.15rem 0.15rem 0.15rem 0.3rem;
254 | margin-right: -1px;
255 | background: var(--ui);
256 | color: var(--bg);
257 | outline: 2px solid var(--ui);
258 | font-size: 1.6rem;
259 | line-height: 1.1rem;
260 | }
261 | #controls button:hover {
262 | background: var(--bg);
263 | color: var(--ui);
264 | cursor: pointer;
265 | }
266 |
267 | #controls-cover {
268 | z-index: 2;
269 | background: var(--ui);
270 | grid-area: 1 / 1;
271 | }
272 |
273 | .controls-cover-revealed {
274 | transition: transform 0.25s ease-in;
275 | transform: translateY(100%);
276 | }
277 |
278 | /* ========== CHANNEL INFORMATION =========================================== */
279 | #channel-info-container {
280 | visibility: hidden;
281 | z-index: 2;
282 | grid-area: 1 / 1;
283 | display: flex;
284 | flex-flow: column nowrap;
285 | background: var(--bg);
286 | border: 1px solid var(--ui);
287 | max-width: 100%;
288 | }
289 |
290 | #channel-info {
291 | margin: 0.75rem;
292 | padding: 0 0.5rem;
293 | flex-grow: 1;
294 | max-width: 100%;
295 | background-color: var(--bg);
296 | display: flex;
297 | flex-flow: column nowrap;
298 | gap: 0;
299 | justify-content: center;
300 | }
301 |
302 | #channel-info .item {
303 | display: flex;
304 | flex-flow: row nowrap;
305 | gap: .25rem;
306 | white-space: nowrap;
307 | text-overflow: ellipsis;
308 | line-height: 1.35rem;
309 | }
310 |
311 | /* ========== EXTRANEOUS SIDEBAR ============================================ */
312 | #under {
313 | display: grid;
314 | height: 7rem;
315 | grid-template-rows: 1fr;
316 | overflow: hidden;
317 | outline: 1px solid var(--ui);
318 | }
319 |
320 | #sidebar {
321 | display: flex;
322 | flex-wrap: nowrap;
323 | gap: 1px;
324 | border: 1px solid var(--ui);
325 | background: var(--bg);
326 | }
327 |
328 | #loader-container {
329 | display: grid;
330 | overflow: hidden;
331 | grid-template-columns: repeat(2, 50%);
332 | grid-template-rows: 1fr;
333 | gap: 1px;
334 | outline: 1px solid var(--ui);
335 | }
336 |
337 | #loader-cover-left {
338 | transition: transform 0.5s;
339 | z-index: 2;
340 | grid-area: 1 / 1 / 1 / 1;
341 | background: var(--ui);
342 | }
343 | .loader-cover-left-revealed {
344 | transition: transform 0.5s;
345 | transform: translateX(-100%) !important;
346 | }
347 | #loader-cover-right {
348 | transition: transform 0.5s;
349 | z-index: 2;
350 | grid-area: 1 / 2 / 1 / 2;
351 | background-color: var(--ui);
352 | }
353 | .loader-cover-right-revealed {
354 | transition: transform 0.5s;
355 | transform: translateX(100%) !important;
356 | }
357 |
358 | #loader {
359 | grid-area: 1 / 1 / 1 / 2;
360 | background-color: var(--bg);
361 | background-size: contain;
362 | }
363 |
364 | #loader.active {
365 | background-image: url("../_asset/gif/3.gif") !important;
366 | }
367 |
368 | #progress-outer-container {
369 | display: grid;
370 | grid-template-columns: 1fr;
371 | grid-template-rows: 1fr;
372 | flex-grow: 1;
373 | align-content: stretch;
374 | }
375 |
376 | #progress-background-lines {
377 | grid-area: 1 / 1 / 1 / 1;
378 | display: flex;
379 | flex-wrap: nowrap;
380 | gap: 1px;
381 | background: var(--ui);
382 | }
383 |
384 | #progress-background-lines .sep {
385 | flex-grow: 1;
386 | background: var(--bg);
387 | }
388 |
389 | #progress-bar-container {
390 | grid-area: 1 / 1 / 1 / 1;
391 | z-index: 2;
392 | display: flex;
393 | flex-wrap: nowrap;
394 | justify-content: center;
395 | align-items: center;
396 | gap: 18%;
397 | }
398 |
399 | .progress-bar {
400 | height: 90%;
401 | display: flex;
402 | flex-basis: 28%;
403 | flex-wrap: nowrap;
404 | background: var(--bg);
405 | outline: 1px solid var(--ui);
406 | }
407 |
408 | .progress-bar-filler {
409 | margin: 2px;
410 | background: var(--ui);
411 | transition: flex-basis 0.35s ease-in-out;
412 | }
413 |
--------------------------------------------------------------------------------
/resources/public/_css/reset.css:
--------------------------------------------------------------------------------
1 | /* CSS reset */
2 | *, *::before, *::after {box-sizing: border-box;}
3 | * {margin: 0;}
4 | html {height: 100%;}
5 | body {line-height: 1.5; -webkit-font-smoothing: antialiased;}
6 | img, picture, video, canvas, svg {display: block; max-width: 100%;}
7 | input, button, textarea, select {font: inherit;}
8 | p, h1, h2, h3, h4, h5, h6 {overflow-wrap: break-word;}
9 | #root, #__next {isolation: isolate;}
10 |
--------------------------------------------------------------------------------
/resources/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kees-/arena-graph/b7efb4103ca64c7c7028ed04ddcc2c9e005e75fe/resources/public/favicon.ico
--------------------------------------------------------------------------------
/resources/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Amoeba
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/shadow-cljs.edn:
--------------------------------------------------------------------------------
1 | {:nrepl {:port 8777}
2 | :source-paths ["src" "test"]
3 |
4 | :dependencies
5 | [[binaryage/devtools "1.0.6"]
6 | [cljs-ajax "0.8.4"]
7 | [reagent "1.1.1"]
8 | [re-frame "1.3.0"]
9 | [day8.re-frame/http-fx "0.2.4"]
10 | [day8.re-frame/tracing "0.6.2"]
11 | [day8.re-frame/re-frame-10x "1.5.0"]]
12 |
13 | :dev-http
14 | {8280 "resources/public"
15 | 8290 "target/browser-test"}
16 |
17 | :builds
18 | {:app
19 | {:target :browser
20 | :output-dir "resources/public/_js/compiled"
21 | :asset-path "/_js/compiled"
22 | :modules {:app {:init-fn kees.arena-graph.main/init}}
23 | :devtools {:preloads [day8.re-frame-10x.preload
24 | shadow.remote.runtime.cljs.browser]}
25 | :dev {:compiler-options
26 | {:closure-defines
27 | {re-frame.trace.trace-enabled? true
28 | day8.re-frame.tracing.trace-enabled? true}}}
29 | :release {:build-options
30 | {:ns-aliases
31 | {day8.re-frame.tracing day8.re-frame.tracing-stubs}}}}}}
32 |
--------------------------------------------------------------------------------
/src/kees/arena_graph/config.cljs:
--------------------------------------------------------------------------------
1 | (ns kees.arena-graph.config)
2 |
3 | (def debug?
4 | ^boolean goog.DEBUG)
5 |
--------------------------------------------------------------------------------
/src/kees/arena_graph/graphs.cljs:
--------------------------------------------------------------------------------
1 | (ns kees.arena-graph.graphs
2 | (:require ["react-force-graph-2d" :as ForceGraph2D]
3 | [kees.arena-graph.rf :as rf :refer [evt]]))
4 |
5 | #_{:clj-kondo/ignore [:unused-binding]}
6 | (defn element
7 | [data]
8 | (let [{:keys [width height]} ( ForceGraph2D
11 | {:graphData data
12 | :width width
13 | :height height
14 | :minZoom 0.2
15 | :maxZoom 7.5
16 | :d3VelocityDecay 0.5
17 | :nodeVal :size
18 | #_#_:nodeLabel :title
19 | :nodeColor :color
20 | :onNodeClick #(>evt [::rf/graph-node->visit %1])
21 | :onNodeHover #(>evt [::rf/hover-node %1])
22 | :onNodeDrag #(>evt [::rf/hover-node %1])
23 | :onNodeDragEnd #(>evt [::rf/hover-node nil])
24 | :linkWidth 1}])))
25 |
--------------------------------------------------------------------------------
/src/kees/arena_graph/logic.cljs:
--------------------------------------------------------------------------------
1 | (ns kees.arena-graph.logic
2 | "Miscellaneous helper functions"
3 | (:require [clojure.string :as s]))
4 |
5 | (def ^:private ui-var
6 | (-> js/document.body
7 | js/window.getComputedStyle
8 | (.getPropertyValue "--ui")
9 | s/trim))
10 |
11 | (defn- gen-hex
12 | "Supply three 2-tuples of [base variation] where base + variation <= 256"
13 | [& variance-tuples]
14 | (let [hex (fn [[n v]] (.toString (+ n (rand-int v)) 16))
15 | pad (fn [n] (str (when (= 1 (count n)) "0") n))]
16 | (->> variance-tuples
17 | (map (comp pad hex))
18 | (into ["#"])
19 | (reduce str))))
20 |
21 | (defmulti hex
22 | "Returns a hex color string"
23 | identity)
24 | (defmethod hex :default [_] "#FFFFFF")
25 |
26 | ;; In use
27 | (defmethod hex :static-var-ui [_] ui-var)
28 | (defmethod hex :gold-light [_] (gen-hex [0xFC 0] [0xD4 20] [0x48 40]))
29 | (defmethod hex :aqua [_] (gen-hex [0x8C 30] [0xD2 30] [0xBE 30]))
30 |
31 | ;; Misc
32 | (defmethod hex :gold [_] (gen-hex [0xDE 20] [0xCE 34] [0x32 20]))
33 | (defmethod hex :acid [_] (gen-hex [0x8B 70] [0xF2 14] [0 20]))
34 | (defmethod hex :green-murky [_] (gen-hex [0xAB 30] [0xC3 20] [0 10]))
35 | (defmethod hex :lavender [_] (gen-hex [0xC8 20] [0xB4 35] [0xC8 25]))
36 |
37 | (defn hex-map
38 | "Returns a hash-map supplying a random color in specified hue range"
39 | [color-key]
40 | {:color (hex color-key)})
41 |
42 | (defn size-variant
43 | "Return a hash-map of :size to a float within [b,b+v)"
44 | [base variant]
45 | {:size (+ base (* variant (rand)))})
46 |
47 | ;; Vector of 2-tuples [a b] where a is chance out of 1 that gif b is chosen.
48 | ;; Sum of numbers must be < 1
49 | (def ^:private gif-chances
50 | (sort
51 | [[0.02 "takase.gif"]
52 | [0.05 "sparkle.gif"]
53 | [0.1 "scroll.gif"]
54 | [0.1 "ripples.gif"]
55 | [0.25 "planet.gif"]]))
56 |
57 | ;; 1 - the sum of gif-chances is the probability of the default gif playing.
58 | (def ^:private default-gif
59 | "tan.gif")
60 |
61 | (defn which-gif
62 | []
63 | (let [n (rand)]
64 | (loop [chances gif-chances
65 | acc 0]
66 | (let [[[probability filename] & remaining] chances
67 | acc (+ acc probability)]
68 | (cond
69 | (empty? chances) default-gif
70 | (< n acc) filename
71 | :else (recur remaining acc))))))
72 |
73 | (defn into-by-key
74 | "Combines two vectors of maps, skipping repeated values of key k"
75 | [v1 v2 k]
76 | (let [key-compare (fn [acc el]
77 | (if (some #{(k el)} (map k acc))
78 | acc
79 | (conj acc el)))]
80 | (reduce key-compare v1 v2)))
81 |
--------------------------------------------------------------------------------
/src/kees/arena_graph/main.cljs:
--------------------------------------------------------------------------------
1 | #_{:clj-kondo/ignore [:unused-referred-var]}
2 | (ns kees.arena-graph.main
3 | (:require
4 | [reagent.dom :as rdom]
5 | [re-frame.core :as re-frame]
6 | [kees.arena-graph.rf :as rf :refer [evt >evt-now]]
7 | [kees.arena-graph.views :as views]
8 | [kees.arena-graph.config :as config]))
9 |
10 | (defn dev-setup []
11 | (when config/debug?
12 | (println "dev mode")))
13 |
14 | (defn ^:dev/after-load mount-root []
15 | (re-frame/clear-subscription-cache!)
16 | (let [root (.getElementById js/document "app")]
17 | (rdom/unmount-component-at-node root)
18 | (rdom/render [views/main] root)))
19 |
20 | #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
21 | (defn init []
22 | (>evt-now [::rf/boot])
23 | (dev-setup)
24 | (mount-root))
25 |
--------------------------------------------------------------------------------
/src/kees/arena_graph/rf.cljs:
--------------------------------------------------------------------------------
1 | (ns kees.arena-graph.rf
2 | (:require [ajax.core :refer [json-request-format json-response-format]]
3 | [clojure.string :as s]
4 | [re-frame.core :as re-frame :refer [reg-event-db reg-event-fx reg-sub reg-fx reg-cofx inject-cofx path]]
5 | [day8.re-frame.http-fx]
6 | [kees.arena-graph.logic :as logic]
7 | [kees.arena-graph.rf.console :as console]
8 | [kees.arena-graph.rf.flavor :as flavor]))
9 |
10 | ;; ========== SETUP ============================================================
11 | (def evt re-frame/dispatch)
13 | (def >evt-now re-frame/dispatch-sync)
14 | (defn assoc [k v] (>evt [::assoc k v]))
16 | (defn >GET [opts] (>evt [::GET opts]))
17 |
18 | ;; Source!: https://clojureverse.org/t/9104/9
19 | (def ^:private url-query-params
20 | (let [query-arr (-> js/window
21 | .-location
22 | .-href
23 | js/URL.
24 | .-searchParams
25 | js/URLSearchParams.
26 | js/Array.from)
27 | f (fn [m [k v]]
28 | (update m (keyword k) (fn [cur]
29 | (cond
30 | (nil? cur) v
31 | (vector? cur) (conj cur v)
32 | :else [cur v]))))]
33 | (reduce f {} query-arr)))
34 |
35 | (reg-cofx
36 | :screen-width
37 | (fn [cofx]
38 | (let [width (.-innerWidth js/window)]
39 | (-> cofx
40 | (assoc :screen-width width)
41 | (assoc :vertical-layout? (<= width 666))))))
42 |
43 | (def ^:private falsy-strs
44 | ["n" "no" "none" "false" "skip" "hide"])
45 | (def ^:private skip-intro?
46 | (some #{(:intro url-query-params)} falsy-strs))
47 |
48 | (def global-per 50)
49 |
50 | (def empty-graph
51 | {:nodes []
52 | :links []})
53 |
54 | (def default-progress
55 | {:current 0
56 | :total 0
57 | :channel-total 0
58 | :channel-current 0})
59 |
60 | (def default-db
61 | {:graph-data empty-graph
62 | :thumb {}
63 | :hovered-node nil
64 | :console []
65 | :version 2
66 | :skip-intro? skip-intro?
67 | :canvas-covered? false
68 | :initialized? false ; whether the app has finished its startup and intro
69 | :working? false ; whether to display "create" button / allow creation
70 | :active? false ; whether to display gif panel
71 | :progress default-progress
72 | #_#_ :palette-color :aqua ; for testing
73 | :style {:o1-color :gold-light
74 | :o2-color :aqua}
75 | :flavor {:completed-explanation-seen false}})
76 |
77 | (def ^:private location "https://api.are.na/v2/")
78 | (def ^:private auth "")
79 |
80 | (def node-keys
81 | [:id :slug :title :owner_slug :base_class :user :length])
82 |
83 | (reg-fx :tap (fn [data] (tap> data)))
84 | (reg-fx :error (fn [resp] (.error js/console "ERROR:" (clj->js resp))))
85 | (reg-fx :browse (fn [url] (.open js/window url)))
86 | (reg-fx :blur (fn [] (.blur (.-activeElement js/document))))
87 |
88 | ;; Provide a map with, at minimum, :path and :on-success kvs
89 | ; :path is a vector of the URI path components to be appended to the API URL
90 | ; :on-success is a namespaced kw for an event handler that accepts the response
91 | (reg-event-fx
92 | ::GET
93 | (fn [_ [_ {:keys [path] :as opts}]]
94 | (let [uri (->> path
95 | (mapv (comp #(s/replace % "^/|/$" "") str))
96 | (interpose "/")
97 | (apply str location))
98 | vwrap #(if (vector? %) % [%])
99 | req-keys [:params :on-success :on-failure]
100 | supplied (-> opts
101 | (select-keys req-keys)
102 | (update :on-success vwrap)
103 | (update :on-failure vwrap))
104 | default-opts {:method :get
105 | :timeout 15000
106 | :format (json-request-format)
107 | :response-format (json-response-format {:keywords? true})
108 | :on-failure [::console/log :error "Oh no! Something went wrong."]}
109 | request (-> (merge default-opts supplied {:uri uri})
110 | (assoc-in [:headers :authorization] auth))]
111 | {:fx [[:http-xhrio request]]})))
112 |
113 | (reg-event-fx
114 | ::o1-GET-loop
115 | (fn [{:keys [db]} [_ pages remaining accumulation completion-evt & resp]]
116 | (let [channel (get-in db [:thumb :id])
117 | current (dec remaining)
118 | accumulation (into accumulation (get (first resp) :contents))]
119 | (if (< remaining 1)
120 | {:fx [[:dispatch (conj completion-evt accumulation)]]}
121 | {:db (-> db
122 | (assoc-in [:progress :channel-current] (- pages current))
123 | (assoc-in [:progress :channel-total] pages))
124 | :fx [(when (< 1 pages)
125 | [:dispatch [::console/log :info "Requesting page" (- pages current) "of" pages]])
126 | [:dispatch-later
127 | {:ms 500
128 | :dispatch [::GET
129 | {:path ["channels" channel "contents"]
130 | :params {:page (- pages current)
131 | :per global-per}
132 | :on-success [::o1-GET-loop
133 | pages
134 | current
135 | accumulation
136 | completion-evt]
137 | :on-failure [::console/log :error ":( Something went wrong"]}]}]]}))))
138 |
139 | (reg-event-fx
140 | ::o2-GET-node-loop
141 | (fn [_ [_
142 | {:keys [id pages remaining accumulation completion-evt]
143 | :or {accumulation []}}
144 | & resp]]
145 | (let [current (dec remaining)
146 | accumulation (into accumulation (:contents (first resp)))]
147 | (if (< remaining 1)
148 | {:fx [[:dispatch (conj completion-evt accumulation)]]}
149 | (let [next-args {:id id
150 | :pages pages
151 | :remaining current
152 | :accumulation accumulation
153 | :completion-evt completion-evt}]
154 | {:fx [(when (< 1 pages)
155 | [:dispatch [::console/log :info "Requesting page" (- pages current) "of" pages]])
156 | [:dispatch-later
157 | {:ms 750
158 | :dispatch [::GET
159 | {:path ["channels" id "contents"]
160 | :params {:page (- pages current)
161 | :per global-per}
162 | :on-success [::o2-GET-node-loop next-args]
163 | :on-failure [::GET-error next-args]}]}]]})))))
164 |
165 | (reg-event-fx
166 | ::GET-error
167 | (fn [_ [_ next-args resp]]
168 | (let [{:keys [response]} resp]
169 | {:fx [[::flavor/request-error (:code response)]
170 | [:dispatch-later
171 | {:ms 2000
172 | :dispatch [::o2-GET-node-loop (update next-args :remaining dec)]}]]})))
173 |
174 | ;; ========== EFFECTS ==========================================================
175 | (reg-event-fx
176 | ::boot
177 | [(inject-cofx :screen-width)]
178 | (fn [cofx _]
179 | (let [skip? (:skip-intro? default-db)
180 | layout (select-keys cofx [:screen-width :vertical-layout?])]
181 | {:db (merge default-db layout)
182 | :fx [[:dispatch [::flavor/intro skip?]]]})))
183 |
184 | #_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
185 | (reg-event-fx
186 | ::tap
187 | (fn [_ [_ data]]
188 | {:fx [[:tap data]]}))
189 |
190 | (reg-event-db
191 | ::assoc
192 | (fn [db [_ k v]]
193 | (assoc db k v)))
194 |
195 | (reg-event-db
196 | ::set-busy
197 | (fn [db [_ bool]]
198 | (-> db
199 | (assoc :working? bool)
200 | (assoc :active? bool))))
201 |
202 | (reg-event-db
203 | ::toggle-canvas-cover
204 | (fn [db _]
205 | (update db :canvas-covered? not)))
206 |
207 | (reg-event-fx
208 | ::select-channel-success
209 | (fn [{:keys [db]} [_ response]]
210 | {:db (assoc db :thumb response)
211 | :fx [[:dispatch-later
212 | [{:ms 500
213 | :dispatch [::console/delayed-log :guide 750 "Great! Looks like a valid channel."]}
214 | {:ms 1750
215 | :dispatch [::set-busy false]}]]]}))
216 |
217 | (reg-event-fx
218 | ::select-channel-failure
219 | (fn [_ [_ response]]
220 | (let [code (-> response :response :code)]
221 | {:fx [[:dispatch [::flavor/generic-error code]]]})))
222 |
223 | (reg-event-fx
224 | ::select-channel
225 | (fn [{:keys [db]} [_ query]]
226 | (if-let [slug (re-find #"[-_a-z0-9]+$" query)]
227 | {:db (assoc db :working? true)
228 | :fx [[:blur nil]
229 | [:dispatch [::console/log :info "Changing channel to:" slug]]
230 | [:dispatch [::GET {:path ["channels" slug "thumb"]
231 | :on-success [::select-channel-success]
232 | :on-failure [::select-channel-failure]}]]]}
233 | {:fx [[:dispatch [::console/log :error "Are you sure that channel name is valid?"]]]})))
234 |
235 | ;; Format a web URL for either channels or blocks and visit them in the browser
236 | (reg-event-fx
237 | ::graph-node->visit
238 | (fn [_ [_ m]]
239 | (let [{:keys [base_class owner_slug slug id]} (js->clj m :keywordize-keys true)
240 | path (if (= "Channel" base_class)
241 | [owner_slug slug]
242 | ["block" id])
243 | url (apply str "https://are.na/" (interpose "/" path))]
244 | {:fx [[:browse url]]})))
245 |
246 | (reg-event-fx
247 | ::hover-node
248 | (fn [{:keys [db]} [_ node]]
249 | (let [node-map (js->clj node :keywordize-keys true)]
250 | {:db (assoc db :hovered-node node-map)
251 | :fx (if node-map
252 | [[::console/show ["channel-info-container" "visible"]]]
253 | [[::console/hide ["channel-info-container" "visible"]]])})))
254 |
255 | ;; Call with a thumb request
256 | (reg-event-db
257 | ::o0-populate
258 | [(path :graph-data)]
259 | (fn [data [_ thumb]]
260 | (let [node (-> thumb
261 | (select-keys node-keys)
262 | (merge (logic/size-variant 3.5 1)
263 | (logic/hex-map :static-var-ui)
264 | {:order 0}))]
265 | (update data :nodes conj node))))
266 |
267 | ;; Call with a seq of channel maps
268 | (reg-event-db
269 | ::o1-populate
270 | [(path :graph-data)]
271 | (fn [data [_ channels]]
272 | (let [nodes (mapv
273 | #(-> (select-keys % node-keys)
274 | (merge (logic/size-variant 0.75 1)
275 | (logic/hex-map :gold-light)
276 | {:order 1}))
277 | channels)]
278 | (update data :nodes into nodes))))
279 |
280 | (reg-event-db
281 | ::connect
282 | [(path :graph-data)]
283 | (fn [data [_ arg-map]]
284 | (let [{:keys [id channels color]} arg-map
285 | links (mapv
286 | #(hash-map :source (:id %)
287 | :target id
288 | :color (logic/hex color))
289 | channels)]
290 | (update data :links into links))))
291 |
292 | (reg-event-db
293 | ::o2-populate
294 | [(path :graph-data)]
295 | (fn [data [_ arg-map]]
296 | (let [{:keys [channels color]} arg-map
297 | nodes (mapv
298 | #(-> (select-keys % node-keys)
299 | (merge (logic/size-variant 0.5 0.5)
300 | (logic/hex-map color)
301 | {:order 2}))
302 | channels)]
303 | (update data :nodes logic/into-by-key nodes :id))))
304 |
305 | ;; Block or continue initialization of graph crawl
306 | (reg-event-fx
307 | ::order-up
308 | (fn [{:keys [db]} _]
309 | (let [id (get-in db [:thumb :id])
310 | id-unknown [[:dispatch [::console/log :error "I'm not finding the id of the channel."]]]
311 | in-progress [[:dispatch [::console/log :error "I'm already working on a graph! Be patient!"]]]
312 | continue [[:dispatch [::console/delayed-log :guide 500 "Okay, I'm getting to work"]]
313 | [:dispatch [::assoc :graph-data empty-graph]]
314 | [:blur nil]
315 | [:dispatch [::set-busy true]]
316 | [:dispatch [::assoc :progress default-progress]]
317 | [:dispatch [::o0-order-up id]]]]
318 | {:fx (cond
319 | (not id) id-unknown
320 | (:working? db) in-progress
321 | :else continue)})))
322 |
323 | (reg-event-fx
324 | ::o0-order-up
325 | (fn [{:keys [db]} [_ id]]
326 | (let [thumb (:thumb db)
327 | length (:length thumb)
328 | pages (Math/ceil (/ length global-per))]
329 | {:fx [[:dispatch [::o0-populate thumb]]
330 | [:dispatch-later
331 | [{:ms 500
332 | :dispatch [::flavor/size-shaming pages]}
333 | {:ms 2000
334 | :dispatch [::o1-GET-loop
335 | pages pages [] [::o1-order-up id]]}]]]})))
336 |
337 | (reg-event-fx
338 | ::o1-order-up
339 | (fn [{:keys [db]} [_ id contents]]
340 | (let [color (get-in db [:style :o1-color])
341 | channels (filterv #(= (:base_class %) "Channel") contents)]
342 | (if (not-empty channels)
343 | {:fx [[:dispatch [::o1-populate channels]]
344 | [:dispatch [::connect {:id id
345 | :channels channels
346 | :color color}]]
347 | [:dispatch [::o2-order-loop (count channels) channels]]]}
348 | {:fx [[:dispatch [::flavor/no-channels]]
349 | [:dispatch [::set-busy false]]]}))))
350 |
351 | (reg-event-fx
352 | ::o2-order-loop
353 | (fn [{:keys [db]} [_ total remaining-channels]]
354 | (let [[active & remaining] remaining-channels
355 | {:keys [length id slug]} active
356 | pages (Math/ceil (/ length global-per))
357 | current-num (- total (count remaining-channels) -1)
358 | processing-str (str "Processing channel "
359 | current-num " of " total
360 | ": " slug)]
361 | {:db (-> db
362 | (assoc-in [:progress :current] current-num)
363 | (assoc-in [:progress :total] total))
364 | :fx [[:dispatch [::console/log :guide processing-str]]
365 | [:dispatch [::o2-GET-node-loop
366 | {:id id
367 | :pages pages
368 | :remaining pages
369 | :completion-evt [::o2-order-up total id remaining]}]]]})))
370 |
371 | (reg-event-fx
372 | ::o2-order-up
373 | (fn [{:keys [db]} [_ total id remaining contents]]
374 | (let [color (get-in db [:style :o2-color])
375 | channels (filterv #(= (:base_class %) "Channel") contents)]
376 | {:fx [[:dispatch [::o2-populate {:channels channels
377 | :color color}]]
378 | [:dispatch [::connect {:id id
379 | :channels channels
380 | :color color}]]
381 | (if remaining
382 | [:dispatch [::o2-order-loop total remaining]]
383 | [:dispatch [::complete]])]})))
384 |
385 | ;; Display flavor and return app to prepared state
386 | (reg-event-fx
387 | ::complete
388 | (fn [{:keys [db]} _]
389 | {:fx [(if (get-in db [:flavor :completed-explanation-seen])
390 | [:dispatch [::console/delayed-log :guide 1000 "Complete!"]]
391 | [:dispatch [::flavor/completed-explanation]])
392 | [:dispatch [::set-busy false]]]}))
393 |
394 | ;; ========== SUBSCRIPTIONS ====================================================
395 | ;; Use via the shortcut > message
18 | (interpose \space)
19 | (into [:span]))])
20 |
21 | ;; #console-anchor is an empty fake el to target when scrolling to bottom
22 | (defn element
23 | []
24 | (let [messages @(re-frame/subscribe [::messages])]
25 | [:div#console
26 | (into
27 | [:ul [:li#console-anchor [:span#typing "..."]]]
28 | messages)]))
29 |
30 | ;; ========== LOGIC ============================================================
31 | (reg-fx
32 | :scroll
33 | (fn [id]
34 | (let [el (js/document.getElementById id)]
35 | (.scrollIntoView el #js{:top (.-offsetHeight id)}))))
36 |
37 | ;; Toggling display of an element (that's invisible by default)
38 | ;; Set display: none on original element if using class "display"
39 | ;; Set visibility: hidden on original element if using class "visible"
40 | (reg-fx
41 | ::show
42 | (fn [[id tmp-class]]
43 | (-> id js/document.getElementById .-classList (.add tmp-class))))
44 | (reg-fx
45 | ::hide
46 | (fn [[id tmp-class]]
47 | (-> id js/document.getElementById .-classList (.remove tmp-class))))
48 | ;; Believe an fx-wrapping event is necessary for delayed dispatch
49 | (reg-event-fx
50 | ::hide
51 | (fn [_ [_ [id tmp-class]]]
52 | {:fx [[::hide [id tmp-class]]]}))
53 |
54 | (reg-fx
55 | :restart-anim
56 | (fn [id]
57 | (let [el (js/document.getElementById id)]
58 | (set! (.. el -style -animationName) "none")
59 | (js/window.requestAnimationFrame
60 | #(set! (.. el -style -animationName) "")))))
61 |
62 | ;; Display a little typing icon in the console for ms
63 | (reg-event-fx
64 | ::typing
65 | (fn [_ [_ ms]]
66 | {:fx [[::show ["typing" "displayed"]]
67 | [:restart-anim "typing"]
68 | [:scroll "console-anchor"]
69 | [:dispatch-later {:ms ms :dispatch [::hide ["typing" "displayed"]]}]]}))
70 |
71 | ;; Log a message to the console DOM element (not browser console)
72 | (reg-event-fx
73 | ::log
74 | (fn [{:keys [db]} [_ type & message]]
75 | {:db (update db :console (partial cons (li type message)))
76 | :fx [[:scroll "console-anchor"]]}))
77 |
78 | ;; Display a typing message for ms and log something immediately after
79 | (reg-event-fx
80 | ::delayed-log
81 | (fn [_ [_ type ms & message]]
82 | {:fx [[:dispatch [::typing ms]]
83 | [:dispatch-later {:ms ms :dispatch (into [::log type] message)}]]}))
84 |
85 | ;; New sub instead of db
15 | (assoc :working? bool)
16 | (assoc :active? bool))))
17 | ;; Hm...
18 |
19 | ;; ========== GENERIC FLAVOR TEXT ==============================================
20 | (reg-event-fx
21 | ::intro
22 | (fn [_ [_ skip?]]
23 | (if skip?
24 | {:fx [[:dispatch [::set-initialized]]
25 | [:dispatch [::console/log :guide "Go!"]]]}
26 | (let [intro "I'll map out connections on the website are.na. Add a channel's URL to get started."]
27 | {:fx [[:dispatch-later
28 | [{:ms 1500
29 | :dispatch [::console/delayed-log :guide 900 "Hi!"]}
30 | {:ms 3250
31 | :dispatch [::console/delayed-log :guide 2250 intro]}
32 | {:ms 7000
33 | :dispatch [::set-initialized]}]]]}))))
34 |
35 | ;; A subtle nudge about what size of channel may work better.
36 | (reg-event-fx
37 | ::size-shaming
38 | (fn [_ [_ pages]]
39 | (let [extra-large [[:dispatch [::console/delayed-log :guide 500 "You're really gonna do that? That's a giant channel. Well..."]]]
40 | large [[:dispatch [::console/delayed-log :guide 500 "Wow, that's some channel! This will take a little time."]]]
41 | medium [[:dispatch [::console/delayed-log :guide 500 "That's a decent sized channel. I'll start looking now."]]]]
42 | {:fx (cond
43 | (< 22 pages) extra-large
44 | (< 13 pages) large
45 | (< 6 pages) medium
46 | :else [])})))
47 |
48 | (reg-event-fx
49 | ::completed-explanation
50 | (fn [{:keys [db]} _]
51 | {:db (assoc-in db [:flavor :completed-explanation-seen] true)
52 | :fx [[:dispatch-later
53 | [{:ms 1500
54 | :dispatch [::console/delayed-log :guide 3500 "Alright it's done! Enjoy. On the desktop you can hover over nodes to see what channels they represent."]}
55 | {:ms 7500
56 | :dispatch [::console/delayed-log :guide 3000 "And clicking a node visits its channel if you didn't notice."]}]]]}))
57 |
58 |
59 | ;; ========== EVENT HANDLING ===================================================
60 | (reg-event-fx
61 | ::request-error
62 | (fn [_ [_ code]]
63 | {:fx [[:dispatch [::console/log :error "Something's gone wrong working with this channel!"]]
64 | [:dispatch [::console/log :error "The most recent request returned a" code "code."]]
65 | [:dispatch [::console/delayed-log :guide 1250 "I'll try again and skip the one that's seeming to cause the problem. Unfortunately some nodes and connections might be missed."]]]}))
66 |
67 | (reg-event-fx
68 | ::unauthorized
69 | (fn [_ [_ code]]
70 | {:fx [[:dispatch [::console/log :error "I got a " code "code."]]
71 | [:dispatch [::console/delayed-log :guide 1000 "That means you weren't authorized to make that request. Is the channel private?"]]
72 | [:dispatch-later
73 | [{:ms 2000
74 | :dispatch [::console/delayed-log :guide 1750 "Sorry... I can't take credentials right now. How about something else?"]}
75 | {:ms 3750
76 | :dispatch [::set-busy false]}]]]}))
77 |
78 | (reg-event-fx
79 | ::no-channels
80 | (fn [_ _]
81 | {:fx [[:dispatch [::console/log :error "The channel you chose doesn't contain links to any other channels!"]]]}))
82 |
83 | (reg-event-fx
84 | ::unknown-error
85 | (fn [_ [_ code]]
86 | {:fx [[:dispatch [::console/log :error "Something's really wrong! The request returned a" code "code."]]
87 | [:dispatch-later
88 | [{:ms 350
89 | :dispatch [::console/delayed-log :guide 1150 "I don't know how to deal with this... Ahh..."]}
90 | {:ms 1750
91 | :dispatch [::console/log :guide "Okay I collected myself. Ready to try something else"]}
92 | {:ms 2000
93 | :dispatch [::set-busy false]}]]]}))
94 |
95 | (reg-event-fx
96 | ::generic-error
97 | (fn [_ [_ code]]
98 | (let [action (case code
99 | 401 [:dispatch [::unauthorized code]]
100 | [:dispatch [::unknown-error code]])]
101 | {:fx [action]})))
102 |
--------------------------------------------------------------------------------
/src/kees/arena_graph/views.cljs:
--------------------------------------------------------------------------------
1 | #_{:clj-kondo/ignore [:unused-referred-var]}
2 | (ns kees.arena-graph.views
3 | (:require [reagent.core :as r]
4 | [kees.arena-graph.graphs :as graphs]
5 | [kees.arena-graph.rf.console :as console]
6 | [kees.arena-graph.rf :as rf :refer [evt >assoc >GET]]
7 | [kees.arena-graph.logic :as logic]))
8 |
9 | (defn- graph
10 | "The container for the generated force graph (initially blank)"
11 | []
12 | [graphs/element (evt [::rf/select-channel @value])
30 | (reset! value ""))
31 | handle-change (fn [e]
32 | (reset! value (.. e -target -value)))
33 | handle-keypress (fn [e]
34 | (when (= (.-code e) "Enter")
35 | (confirm)))]
36 | (fn []
37 | [:div#controls>span
38 | [:input
39 | {:on-change handle-change
40 | :on-key-press handle-keypress
41 | :value @value}]
42 | (when (not= "" @value)
43 | [:button
44 | {:on-click confirm
45 | :style {:font-size "2rem"}}
46 | (char 0x2192)])
47 | (when (and (not (evt [::rf/order-up])}
52 | "create"])])))
53 |
54 | (defn- controls-cover
55 | []
56 | (let [initialized? ( (/ current total 0.01)
84 | js/Math.round
85 | (str "%"))))
86 |
87 | (defn progress-bar-filler
88 | [basis flex-direction]
89 | [:div.progress-bar-filler
90 | {:style {:flex-basis basis
91 | :flex-direction flex-direction}}])
92 |
93 | (defn- progress-bar-1
94 | []
95 | (let [{:keys [channel-current channel-total]} (a.nav-button {:href "https://github.com/kees-/arena-graph"
172 | :target "_blank"}
173 | [:div#github]]
174 | [:span>a.nav-button {:href "https://www.are.na/block/19423227"
175 | :target "_blank"}
176 | [:div#arena]]
177 | [:span>button.nav-button
178 | {:on-click #(>evt [::rf/toggle-canvas-cover])}
179 | [:div#close]]])
180 |
181 | #_
182 | (defn- palette
183 | "Generates an 8x8 color palette to test the acceptable color ranges"
184 | []
185 | (let [palette-color (assoc :palette-color color))
207 | panel (into
208 | [:div
209 | {:style {:display "flex"
210 | :flex-flow "column nowrap"
211 | :justify-content "space-around"}}]
212 | (for [color (keys (methods logic/hex))
213 | :let [color-str (name color)]]
214 | [:button
215 | {:key color
216 | :on-click (partial color-picker color)
217 | :style {:cursor "pointer"}}
218 | color-str]))]
219 | [:div
220 | {:style {:display "flex"
221 | :flex-flow "row nowrap"
222 | :justify-content "center"
223 | :gap "1rem"}}
224 | (into element squares)
225 | panel]))
226 |
227 | (defn main []
228 | [:main
229 | [:header
230 | [:h1 (