├── .nojekyll ├── README.md ├── data-background ├── deck.html ├── deck.js ├── mapbox.html └── mapbox.js ├── data ├── deck.html ├── deck.js ├── mapbox.html └── mapbox.js ├── package.json ├── picking ├── deck.html ├── deck.js ├── mapbox.html └── mapbox.js └── yarn.lock /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/placemark/map-bench/73efbb09e0fc04683b61853536727fe5bea35fef/.nojekyll -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # map-bench 2 | 3 | Some light analysis and research for map frameworks. 4 | 5 | ## Overview table 6 | 7 | | | Mapbox | Deck | 8 | | -- | -- | -- | 9 | | Finding features on the map | queryRenderedFeatures | pickObject(s) | 10 | | Data-driven styles | JSON style documents (Mapbox Style Spec) | imperative JavaScript functions (getRadius, etc) | 11 | | Rendering strategy | Tiled (even for GeoJSON) | Untiled by default | 12 | | Governance | Source-available proprietary Mapbox | Open governance under Linux foundation, main contributors Unfolded & Carto | 13 | | Interface for updating layers and styles | Mostly imperative (addLayers) | Mostly declarative / reactive (diffing layers) | 14 | | Overlay dimensions | Width of lines etc is in pixels, don’t scale with zoom unless you write an expression. | Widths and radiuses are by default in meters, can be set to pixels | 15 | 16 | ## Mapbox vs Deck.gl: "picking" 17 | 18 | See the `picking/` directory. The main takeaway there is that 19 | querying for displayed features - in Mapbox, `queryRenderedFeatures`, 20 | in Deck, `pickObjects`, is a big performance difference. In the 21 | testcase, which attempts to be as equal as possible, I see something 22 | like: 23 | 24 | - Mapbox `queryRenderedFeatures`: 33 queries/ms 25 | - Deck `pickObjects`: 1.5 queries/ms 26 | 27 | In the given scenario, Mapbox is 10-30x faster than Deck. The two 28 | modules take very different approaches to the problem. 29 | 30 | Mapbox creates a [FeatureIndex](https://github.com/mapbox/mapbox-gl-js/blob/cd11bcb3838d2011dc686f6888e87671c108cc1d/src/data/feature_index.js), 31 | which uses an index - [grid-index](https://github.com/mapbox/grid-index) 32 | for where those features are. 33 | 34 | Deck uses [picking](https://deck.gl/docs/developer-guide/custom-layers/picking) - encoding 35 | feature indexes into colors and then writing those to a WebGL buffer. 36 | 37 | The bottleneck in Deck's implementation is that for every call to `pickObject` 38 | or `pickObjects`, it needs to read rendered data from the canvas. This is 39 | a slow operation: it takes up 90% of a bottom-up profile of the example 40 | benchmark. 41 | 42 | --- 43 | 44 | From the user's perspective, it appears that pickObjects and queryRenderedFeatures 45 | have roughly equivalent power, but pickObjects is much slower. I'm not sure currently 46 | whether there are advantages to the color-encoded picking strategy: it seems like 47 | it could be easier for the Deck team to implement new layer types with picking, 48 | especially taking 3D occlusion into account. 49 | 50 | One oddity for the picking approach in Deck is that it seems to always require 51 | a read per pick. In the common case where someone's cursor is moving over 52 | a stationary, non-animated map, it certainly seems like they could re-use 53 | an already-retrieved picking buffer. 54 | 55 | --- 56 | 57 | Via a helpful discussion thread on Deck.gl's side: https://github.com/visgl/deck.gl/discussions/7361 58 | It's expected to use `onHover` events rather than call `pickObjects` from mousemove events. 59 | This cuts down significantly on the number of picking invocations total, and does them 60 | at a lower frequency than mousemoves, and the pickObjects call is running all the time 61 | to power `onHover` anyway, so if you aren't using it, you're wasting time. 62 | 63 | Also, the contention is that it's faster to write the data for `pickObjects` than it 64 | is to recreate a grid index, and that the picking data may be more accurate. 65 | 66 | This is probably enough to make `pickObjects` viable for my usecase. I think it remains 67 | that `pickObjects` is slower at _querying_ than `queryRenderedFeatures`. 68 | 69 | ## Mapbox vs Deck.gl: data 70 | 71 | Mapbox, by default, simplifies and excludes data when it processes 72 | a geojson source in GL JS. The effect of this is extreme with large 73 | datasets composed of geographically tiny features. It renders quickly, 74 | but almost nothing is visible. So the way to get a fair comparison, and 75 | something useful, is to set tolerance to zero: 76 | 77 | ```js 78 | map.addSource("points", { 79 | type: "geojson", 80 | data: geojson, 81 | tolerance: 0, 82 | }); 83 | ``` 84 | 85 | The experience of using Mapbox versus Deck with larger datasets is: 86 | 87 | Deck gets to the initial render much faster and its zoomed out views 88 | are darker than Mapbox's, like the gamma is higher on its antialiasing. 89 | After the initial render, there's a great deal of lag when you pan 90 | around a Deck-rendered map, and almost none navigating the Mapbox one. 91 | This is confirmed by Chrome devtools - Deck lags to 20fps dragging, 92 | Mapbox stays at 60fps. 93 | 94 | 95 | Zooming into the map in Mapbox will show simplified or quantized features that 96 | are then replaced with full-quality features. This doesn't happen 97 | with Deck - there's no simplification, so you never see 98 | simplified features. 99 | 100 | _Note for the reader: this is a surprising result. Mapbox is doing 101 | better with bigger data than I remembered. It's time to look closer._ 102 | 103 | And as I write that note, the Mapbox tab crashes. So there are other 104 | issues with Mapbox that don't occur with Deck. In particular: Mapbox 105 | uses WebWorkers to get tiles, simplify them, etc. Those workers 106 | are shared between your custom GeoJSON layer and the map's own 107 | layers. When you load a big GeoJSON layer, it causes the map's 108 | own layers to load more slowly. There's one effect in particular, 109 | in which a basemap tile will fail to load if you've just 110 | been looking at a part of the map with lots of data and you zoom 111 | out ([screenshot](https://share.cleanshot.com/YfKb2D)). This is 112 | oddly persistent - it'll take seconds, sometimes, to see the tile 113 | load. 114 | -------------------------------------------------------------------------------- /data-background/deck.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Add markers to a web map with a symbol layer 6 | 7 | 8 | 9 | 10 | 21 | 22 | 23 |
24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /data-background/deck.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 2 | "pk.eyJ1IjoidG1jdyIsImEiOiJja2YzMmc3YnkxbWhzMzJudXk2c2x3MTVhIn0.XZpElz19TDemsBc0yvkRPw"; 3 | 4 | const map = new mapboxgl.Map({ 5 | container: "map", 6 | style: "mapbox://styles/mapbox/light-v10", 7 | center: [-75, 38.5], 8 | zoom: 7, 9 | }); 10 | 11 | map.once("load", () => { 12 | fetch("https://tmcw-tmp-cors.s3.amazonaws.com/Delaware.geojson") 13 | .then((data) => data.json()) 14 | .then((geojson) => { 15 | const overlay = new deck.MapboxOverlay({ 16 | layers: [ 17 | new deck.GeoJsonLayer({ 18 | data: geojson.features, 19 | id: "points", 20 | pointRadiusUnits: "pixels", 21 | lineWidthUnits: "pixels", 22 | getLineWidth: 2, 23 | getLineColor: [0, 0, 0, 255], 24 | }), 25 | ], 26 | }); 27 | map.addControl(overlay); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /data-background/mapbox.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Add markers to a web map with a symbol layer 6 | 7 | 8 | 9 | 20 | 21 | 22 |
23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /data-background/mapbox.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 2 | "pk.eyJ1IjoidG1jdyIsImEiOiJja2YzMmc3YnkxbWhzMzJudXk2c2x3MTVhIn0.XZpElz19TDemsBc0yvkRPw"; 3 | 4 | mapboxgl.workerCount = 4; 5 | 6 | const map = new mapboxgl.Map({ 7 | container: "map", 8 | // Choose from Mapbox's core styles, or make your own style with Mapbox Studio 9 | style: "mapbox://styles/mapbox/light-v10", 10 | center: [-75, 38.5], 11 | zoom: 7, 12 | }); 13 | 14 | const features = []; 15 | for (let i = 0; i < 1e4; i++) { 16 | features.push({ 17 | // feature for Mapbox DC 18 | type: "Feature", 19 | geometry: { 20 | type: "Point", 21 | coordinates: [(i / 1e4 - 0.5) * 80, (i / 1e4 - 0.5) * 80], 22 | }, 23 | properties: {}, 24 | }); 25 | } 26 | 27 | map.on("load", () => { 28 | fetch("https://tmcw-tmp-cors.s3.amazonaws.com/Delaware.geojson") 29 | .then((data) => data.json()) 30 | .then((geojson) => { 31 | map.addSource("points", { 32 | type: "geojson", 33 | data: geojson, 34 | tolerance: 0, 35 | }); 36 | 37 | map.addLayer({ 38 | id: "points", 39 | type: "fill", 40 | source: "points", 41 | layout: {}, 42 | }); 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /data/deck.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Add markers to a web map with a symbol layer 6 | 7 | 8 | 9 | 10 | 21 | 22 | 23 |
24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /data/deck.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 2 | "pk.eyJ1IjoidG1jdyIsImEiOiJja2YzMmc3YnkxbWhzMzJudXk2c2x3MTVhIn0.XZpElz19TDemsBc0yvkRPw"; 3 | 4 | const map = new mapboxgl.Map({ 5 | container: "map", 6 | // Choose from Mapbox's core styles, or make your own style with Mapbox Studio 7 | style: { 8 | version: 8, 9 | name: "empty", 10 | layers: [], 11 | sources: {}, 12 | }, 13 | center: [-75, 38.5], 14 | zoom: 7, 15 | }); 16 | 17 | map.once("load", () => { 18 | fetch("https://tmcw-tmp-cors.s3.amazonaws.com/Delaware.geojson") 19 | .then((data) => data.json()) 20 | .then((geojson) => { 21 | const overlay = new deck.MapboxOverlay({ 22 | layers: [ 23 | new deck.GeoJsonLayer({ 24 | data: geojson.features, 25 | id: "points", 26 | pointRadiusUnits: "pixels", 27 | lineWidthUnits: "pixels", 28 | getLineWidth: 2, 29 | getLineColor: [0, 0, 0, 255], 30 | }), 31 | ], 32 | }); 33 | map.addControl(overlay); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /data/mapbox.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Add markers to a web map with a symbol layer 6 | 7 | 8 | 9 | 20 | 21 | 22 |
23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /data/mapbox.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 2 | "pk.eyJ1IjoidG1jdyIsImEiOiJja2YzMmc3YnkxbWhzMzJudXk2c2x3MTVhIn0.XZpElz19TDemsBc0yvkRPw"; 3 | 4 | const map = new mapboxgl.Map({ 5 | container: "map", 6 | // Choose from Mapbox's core styles, or make your own style with Mapbox Studio 7 | style: { 8 | version: 8, 9 | name: "empty", 10 | layers: [], 11 | sources: {}, 12 | }, 13 | center: [-75, 38.5], 14 | zoom: 7, 15 | }); 16 | 17 | const features = []; 18 | for (let i = 0; i < 1e4; i++) { 19 | features.push({ 20 | // feature for Mapbox DC 21 | type: "Feature", 22 | geometry: { 23 | type: "Point", 24 | coordinates: [(i / 1e4 - 0.5) * 80, (i / 1e4 - 0.5) * 80], 25 | }, 26 | properties: {}, 27 | }); 28 | } 29 | 30 | map.on("load", () => { 31 | fetch("https://tmcw-tmp-cors.s3.amazonaws.com/Delaware.geojson") 32 | .then((data) => data.json()) 33 | .then((geojson) => { 34 | map.addSource("points", { 35 | type: "geojson", 36 | data: geojson, 37 | tolerance: 0, 38 | }); 39 | 40 | map.addLayer({ 41 | id: "points", 42 | type: "fill", 43 | source: "points", 44 | layout: {}, 45 | }); 46 | }); 47 | }); 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "map-bench", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "devDependencies": { 7 | "eslint": "^8.26.0", 8 | "prettier": "^2.7.1" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /picking/deck.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Add markers to a web map with a symbol layer 6 | 7 | 8 | 9 | 10 | 21 | 22 | 23 |
24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /picking/deck.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 2 | "pk.eyJ1IjoidG1jdyIsImEiOiJja2YzMmc3YnkxbWhzMzJudXk2c2x3MTVhIn0.XZpElz19TDemsBc0yvkRPw"; 3 | 4 | const map = new mapboxgl.Map({ 5 | container: "map", 6 | // Choose from Mapbox's core styles, or make your own style with Mapbox Studio 7 | style: { 8 | version: 8, 9 | name: "empty", 10 | layers: [], 11 | sources: {}, 12 | }, 13 | center: [0, 0], 14 | zoom: 2, 15 | }); 16 | 17 | const features = []; 18 | for (let i = 0; i < 1e4; i++) { 19 | features.push({ 20 | // feature for Mapbox DC 21 | type: "Feature", 22 | geometry: { 23 | type: "Point", 24 | coordinates: [(i / 1e4 - 0.5) * 80, (i / 1e4 - 0.5) * 80], 25 | }, 26 | properties: {}, 27 | }); 28 | } 29 | 30 | map.once("load", () => { 31 | const overlay = new deck.MapboxOverlay({ 32 | layers: [ 33 | new deck.GeoJsonLayer({ 34 | data: features, 35 | id: "points", 36 | pickable: true, 37 | pointRadiusUnits: "pixels", 38 | getPointRadius: 5, 39 | }), 40 | ], 41 | }); 42 | map.addControl(overlay); 43 | 44 | function doQuery() { 45 | const objects = overlay.pickObjects({ 46 | x: Math.random() * 800, 47 | y: Math.random() * 800, 48 | layerIds: ["points"], 49 | }); 50 | } 51 | 52 | setInterval(() => { 53 | const start = Date.now(); 54 | let ticks = 1e3; 55 | for (let i = 0; i < ticks; i++) { 56 | doQuery(); 57 | } 58 | const elapsed = Date.now() - start; 59 | const perSecond = ticks / elapsed; 60 | 61 | counter.innerHTML = `${perSecond.toFixed(2)} query/ms`; 62 | }, 1000); 63 | }); 64 | -------------------------------------------------------------------------------- /picking/mapbox.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Add markers to a web map with a symbol layer 6 | 7 | 8 | 9 | 20 | 21 | 22 |
23 |
24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /picking/mapbox.js: -------------------------------------------------------------------------------- 1 | mapboxgl.accessToken = 2 | "pk.eyJ1IjoidG1jdyIsImEiOiJja2YzMmc3YnkxbWhzMzJudXk2c2x3MTVhIn0.XZpElz19TDemsBc0yvkRPw"; 3 | 4 | const map = new mapboxgl.Map({ 5 | container: "map", 6 | // Choose from Mapbox's core styles, or make your own style with Mapbox Studio 7 | style: { 8 | version: 8, 9 | name: "empty", 10 | layers: [], 11 | sources: {}, 12 | }, 13 | center: [0, 0], 14 | zoom: 2, 15 | }); 16 | 17 | const features = []; 18 | for (let i = 0; i < 1e4; i++) { 19 | features.push({ 20 | // feature for Mapbox DC 21 | type: "Feature", 22 | geometry: { 23 | type: "Point", 24 | coordinates: [(i / 1e4 - 0.5) * 80, (i / 1e4 - 0.5) * 80], 25 | }, 26 | properties: {}, 27 | }); 28 | } 29 | 30 | map.on("load", () => { 31 | map.addSource("points", { 32 | type: "geojson", 33 | data: { 34 | type: "FeatureCollection", 35 | features: features, 36 | }, 37 | }); 38 | 39 | map.addLayer({ 40 | id: "points", 41 | type: "circle", 42 | source: "points", 43 | layout: {}, 44 | }); 45 | 46 | function doQuery() { 47 | const features = map.queryRenderedFeatures( 48 | [Math.random() * 800, Math.random() * 800], 49 | { 50 | layers: ["points"], 51 | } 52 | ); 53 | } 54 | 55 | setInterval(() => { 56 | const start = performance.now(); 57 | let ticks = 1e3; 58 | for (let i = 0; i < ticks; i++) { 59 | doQuery(); 60 | } 61 | const elapsed = performance.now() - start; 62 | const perSecond = ticks / elapsed; 63 | 64 | counter.innerHTML = `${perSecond.toFixed(2)} query/ms`; 65 | }, 1000); 66 | }); 67 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@eslint/eslintrc@^1.3.3": 6 | version "1.3.3" 7 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" 8 | integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== 9 | dependencies: 10 | ajv "^6.12.4" 11 | debug "^4.3.2" 12 | espree "^9.4.0" 13 | globals "^13.15.0" 14 | ignore "^5.2.0" 15 | import-fresh "^3.2.1" 16 | js-yaml "^4.1.0" 17 | minimatch "^3.1.2" 18 | strip-json-comments "^3.1.1" 19 | 20 | "@humanwhocodes/config-array@^0.11.6": 21 | version "0.11.6" 22 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.6.tgz#6a51d603a3aaf8d4cf45b42b3f2ac9318a4adc4b" 23 | integrity sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg== 24 | dependencies: 25 | "@humanwhocodes/object-schema" "^1.2.1" 26 | debug "^4.1.1" 27 | minimatch "^3.0.4" 28 | 29 | "@humanwhocodes/module-importer@^1.0.1": 30 | version "1.0.1" 31 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 32 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 33 | 34 | "@humanwhocodes/object-schema@^1.2.1": 35 | version "1.2.1" 36 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 37 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 38 | 39 | "@nodelib/fs.scandir@2.1.5": 40 | version "2.1.5" 41 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 42 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 43 | dependencies: 44 | "@nodelib/fs.stat" "2.0.5" 45 | run-parallel "^1.1.9" 46 | 47 | "@nodelib/fs.stat@2.0.5": 48 | version "2.0.5" 49 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 50 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 51 | 52 | "@nodelib/fs.walk@^1.2.8": 53 | version "1.2.8" 54 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 55 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 56 | dependencies: 57 | "@nodelib/fs.scandir" "2.1.5" 58 | fastq "^1.6.0" 59 | 60 | acorn-jsx@^5.3.2: 61 | version "5.3.2" 62 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 63 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 64 | 65 | acorn@^8.8.0: 66 | version "8.8.1" 67 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" 68 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 69 | 70 | ajv@^6.10.0, ajv@^6.12.4: 71 | version "6.12.6" 72 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 73 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 74 | dependencies: 75 | fast-deep-equal "^3.1.1" 76 | fast-json-stable-stringify "^2.0.0" 77 | json-schema-traverse "^0.4.1" 78 | uri-js "^4.2.2" 79 | 80 | ansi-regex@^5.0.1: 81 | version "5.0.1" 82 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 83 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 84 | 85 | ansi-styles@^4.1.0: 86 | version "4.3.0" 87 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 88 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 89 | dependencies: 90 | color-convert "^2.0.1" 91 | 92 | argparse@^2.0.1: 93 | version "2.0.1" 94 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 95 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 96 | 97 | balanced-match@^1.0.0: 98 | version "1.0.2" 99 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 100 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 101 | 102 | brace-expansion@^1.1.7: 103 | version "1.1.11" 104 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 105 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 106 | dependencies: 107 | balanced-match "^1.0.0" 108 | concat-map "0.0.1" 109 | 110 | callsites@^3.0.0: 111 | version "3.1.0" 112 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 113 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 114 | 115 | chalk@^4.0.0: 116 | version "4.1.2" 117 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 118 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 119 | dependencies: 120 | ansi-styles "^4.1.0" 121 | supports-color "^7.1.0" 122 | 123 | color-convert@^2.0.1: 124 | version "2.0.1" 125 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 126 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 127 | dependencies: 128 | color-name "~1.1.4" 129 | 130 | color-name@~1.1.4: 131 | version "1.1.4" 132 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 133 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 134 | 135 | concat-map@0.0.1: 136 | version "0.0.1" 137 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 138 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 139 | 140 | cross-spawn@^7.0.2: 141 | version "7.0.3" 142 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 143 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 144 | dependencies: 145 | path-key "^3.1.0" 146 | shebang-command "^2.0.0" 147 | which "^2.0.1" 148 | 149 | debug@^4.1.1, debug@^4.3.2: 150 | version "4.3.4" 151 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 152 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 153 | dependencies: 154 | ms "2.1.2" 155 | 156 | deep-is@^0.1.3: 157 | version "0.1.4" 158 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 159 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 160 | 161 | doctrine@^3.0.0: 162 | version "3.0.0" 163 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 164 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 165 | dependencies: 166 | esutils "^2.0.2" 167 | 168 | escape-string-regexp@^4.0.0: 169 | version "4.0.0" 170 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 171 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 172 | 173 | eslint-scope@^7.1.1: 174 | version "7.1.1" 175 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 176 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 177 | dependencies: 178 | esrecurse "^4.3.0" 179 | estraverse "^5.2.0" 180 | 181 | eslint-utils@^3.0.0: 182 | version "3.0.0" 183 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 184 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 185 | dependencies: 186 | eslint-visitor-keys "^2.0.0" 187 | 188 | eslint-visitor-keys@^2.0.0: 189 | version "2.1.0" 190 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 191 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 192 | 193 | eslint-visitor-keys@^3.3.0: 194 | version "3.3.0" 195 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 196 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 197 | 198 | eslint@^8.26.0: 199 | version "8.26.0" 200 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.26.0.tgz#2bcc8836e6c424c4ac26a5674a70d44d84f2181d" 201 | integrity sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg== 202 | dependencies: 203 | "@eslint/eslintrc" "^1.3.3" 204 | "@humanwhocodes/config-array" "^0.11.6" 205 | "@humanwhocodes/module-importer" "^1.0.1" 206 | "@nodelib/fs.walk" "^1.2.8" 207 | ajv "^6.10.0" 208 | chalk "^4.0.0" 209 | cross-spawn "^7.0.2" 210 | debug "^4.3.2" 211 | doctrine "^3.0.0" 212 | escape-string-regexp "^4.0.0" 213 | eslint-scope "^7.1.1" 214 | eslint-utils "^3.0.0" 215 | eslint-visitor-keys "^3.3.0" 216 | espree "^9.4.0" 217 | esquery "^1.4.0" 218 | esutils "^2.0.2" 219 | fast-deep-equal "^3.1.3" 220 | file-entry-cache "^6.0.1" 221 | find-up "^5.0.0" 222 | glob-parent "^6.0.2" 223 | globals "^13.15.0" 224 | grapheme-splitter "^1.0.4" 225 | ignore "^5.2.0" 226 | import-fresh "^3.0.0" 227 | imurmurhash "^0.1.4" 228 | is-glob "^4.0.0" 229 | is-path-inside "^3.0.3" 230 | js-sdsl "^4.1.4" 231 | js-yaml "^4.1.0" 232 | json-stable-stringify-without-jsonify "^1.0.1" 233 | levn "^0.4.1" 234 | lodash.merge "^4.6.2" 235 | minimatch "^3.1.2" 236 | natural-compare "^1.4.0" 237 | optionator "^0.9.1" 238 | regexpp "^3.2.0" 239 | strip-ansi "^6.0.1" 240 | strip-json-comments "^3.1.0" 241 | text-table "^0.2.0" 242 | 243 | espree@^9.4.0: 244 | version "9.4.0" 245 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" 246 | integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== 247 | dependencies: 248 | acorn "^8.8.0" 249 | acorn-jsx "^5.3.2" 250 | eslint-visitor-keys "^3.3.0" 251 | 252 | esquery@^1.4.0: 253 | version "1.4.0" 254 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 255 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 256 | dependencies: 257 | estraverse "^5.1.0" 258 | 259 | esrecurse@^4.3.0: 260 | version "4.3.0" 261 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 262 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 263 | dependencies: 264 | estraverse "^5.2.0" 265 | 266 | estraverse@^5.1.0, estraverse@^5.2.0: 267 | version "5.3.0" 268 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 269 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 270 | 271 | esutils@^2.0.2: 272 | version "2.0.3" 273 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 274 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 275 | 276 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 277 | version "3.1.3" 278 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 279 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 280 | 281 | fast-json-stable-stringify@^2.0.0: 282 | version "2.1.0" 283 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 284 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 285 | 286 | fast-levenshtein@^2.0.6: 287 | version "2.0.6" 288 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 289 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 290 | 291 | fastq@^1.6.0: 292 | version "1.13.0" 293 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 294 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 295 | dependencies: 296 | reusify "^1.0.4" 297 | 298 | file-entry-cache@^6.0.1: 299 | version "6.0.1" 300 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 301 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 302 | dependencies: 303 | flat-cache "^3.0.4" 304 | 305 | find-up@^5.0.0: 306 | version "5.0.0" 307 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 308 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 309 | dependencies: 310 | locate-path "^6.0.0" 311 | path-exists "^4.0.0" 312 | 313 | flat-cache@^3.0.4: 314 | version "3.0.4" 315 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 316 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 317 | dependencies: 318 | flatted "^3.1.0" 319 | rimraf "^3.0.2" 320 | 321 | flatted@^3.1.0: 322 | version "3.2.7" 323 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" 324 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 325 | 326 | fs.realpath@^1.0.0: 327 | version "1.0.0" 328 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 329 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 330 | 331 | glob-parent@^6.0.2: 332 | version "6.0.2" 333 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 334 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 335 | dependencies: 336 | is-glob "^4.0.3" 337 | 338 | glob@^7.1.3: 339 | version "7.2.3" 340 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 341 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 342 | dependencies: 343 | fs.realpath "^1.0.0" 344 | inflight "^1.0.4" 345 | inherits "2" 346 | minimatch "^3.1.1" 347 | once "^1.3.0" 348 | path-is-absolute "^1.0.0" 349 | 350 | globals@^13.15.0: 351 | version "13.17.0" 352 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" 353 | integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== 354 | dependencies: 355 | type-fest "^0.20.2" 356 | 357 | grapheme-splitter@^1.0.4: 358 | version "1.0.4" 359 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" 360 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 361 | 362 | has-flag@^4.0.0: 363 | version "4.0.0" 364 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 365 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 366 | 367 | ignore@^5.2.0: 368 | version "5.2.0" 369 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 370 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 371 | 372 | import-fresh@^3.0.0, import-fresh@^3.2.1: 373 | version "3.3.0" 374 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 375 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 376 | dependencies: 377 | parent-module "^1.0.0" 378 | resolve-from "^4.0.0" 379 | 380 | imurmurhash@^0.1.4: 381 | version "0.1.4" 382 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 383 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 384 | 385 | inflight@^1.0.4: 386 | version "1.0.6" 387 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 388 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 389 | dependencies: 390 | once "^1.3.0" 391 | wrappy "1" 392 | 393 | inherits@2: 394 | version "2.0.4" 395 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 396 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 397 | 398 | is-extglob@^2.1.1: 399 | version "2.1.1" 400 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 401 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 402 | 403 | is-glob@^4.0.0, is-glob@^4.0.3: 404 | version "4.0.3" 405 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 406 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 407 | dependencies: 408 | is-extglob "^2.1.1" 409 | 410 | is-path-inside@^3.0.3: 411 | version "3.0.3" 412 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 413 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 414 | 415 | isexe@^2.0.0: 416 | version "2.0.0" 417 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 418 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 419 | 420 | js-sdsl@^4.1.4: 421 | version "4.1.5" 422 | resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" 423 | integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== 424 | 425 | js-yaml@^4.1.0: 426 | version "4.1.0" 427 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 428 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 429 | dependencies: 430 | argparse "^2.0.1" 431 | 432 | json-schema-traverse@^0.4.1: 433 | version "0.4.1" 434 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 435 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 436 | 437 | json-stable-stringify-without-jsonify@^1.0.1: 438 | version "1.0.1" 439 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 440 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 441 | 442 | levn@^0.4.1: 443 | version "0.4.1" 444 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 445 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 446 | dependencies: 447 | prelude-ls "^1.2.1" 448 | type-check "~0.4.0" 449 | 450 | locate-path@^6.0.0: 451 | version "6.0.0" 452 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 453 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 454 | dependencies: 455 | p-locate "^5.0.0" 456 | 457 | lodash.merge@^4.6.2: 458 | version "4.6.2" 459 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 460 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 461 | 462 | minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: 463 | version "3.1.2" 464 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 465 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 466 | dependencies: 467 | brace-expansion "^1.1.7" 468 | 469 | ms@2.1.2: 470 | version "2.1.2" 471 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 472 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 473 | 474 | natural-compare@^1.4.0: 475 | version "1.4.0" 476 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 477 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 478 | 479 | once@^1.3.0: 480 | version "1.4.0" 481 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 482 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 483 | dependencies: 484 | wrappy "1" 485 | 486 | optionator@^0.9.1: 487 | version "0.9.1" 488 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 489 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 490 | dependencies: 491 | deep-is "^0.1.3" 492 | fast-levenshtein "^2.0.6" 493 | levn "^0.4.1" 494 | prelude-ls "^1.2.1" 495 | type-check "^0.4.0" 496 | word-wrap "^1.2.3" 497 | 498 | p-limit@^3.0.2: 499 | version "3.1.0" 500 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 501 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 502 | dependencies: 503 | yocto-queue "^0.1.0" 504 | 505 | p-locate@^5.0.0: 506 | version "5.0.0" 507 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 508 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 509 | dependencies: 510 | p-limit "^3.0.2" 511 | 512 | parent-module@^1.0.0: 513 | version "1.0.1" 514 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 515 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 516 | dependencies: 517 | callsites "^3.0.0" 518 | 519 | path-exists@^4.0.0: 520 | version "4.0.0" 521 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 522 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 523 | 524 | path-is-absolute@^1.0.0: 525 | version "1.0.1" 526 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 527 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 528 | 529 | path-key@^3.1.0: 530 | version "3.1.1" 531 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 532 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 533 | 534 | prelude-ls@^1.2.1: 535 | version "1.2.1" 536 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 537 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 538 | 539 | prettier@^2.7.1: 540 | version "2.7.1" 541 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" 542 | integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== 543 | 544 | punycode@^2.1.0: 545 | version "2.1.1" 546 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 547 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 548 | 549 | queue-microtask@^1.2.2: 550 | version "1.2.3" 551 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 552 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 553 | 554 | regexpp@^3.2.0: 555 | version "3.2.0" 556 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 557 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 558 | 559 | resolve-from@^4.0.0: 560 | version "4.0.0" 561 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 562 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 563 | 564 | reusify@^1.0.4: 565 | version "1.0.4" 566 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 567 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 568 | 569 | rimraf@^3.0.2: 570 | version "3.0.2" 571 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 572 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 573 | dependencies: 574 | glob "^7.1.3" 575 | 576 | run-parallel@^1.1.9: 577 | version "1.2.0" 578 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 579 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 580 | dependencies: 581 | queue-microtask "^1.2.2" 582 | 583 | shebang-command@^2.0.0: 584 | version "2.0.0" 585 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 586 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 587 | dependencies: 588 | shebang-regex "^3.0.0" 589 | 590 | shebang-regex@^3.0.0: 591 | version "3.0.0" 592 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 593 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 594 | 595 | strip-ansi@^6.0.1: 596 | version "6.0.1" 597 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 598 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 599 | dependencies: 600 | ansi-regex "^5.0.1" 601 | 602 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 603 | version "3.1.1" 604 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 605 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 606 | 607 | supports-color@^7.1.0: 608 | version "7.2.0" 609 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 610 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 611 | dependencies: 612 | has-flag "^4.0.0" 613 | 614 | text-table@^0.2.0: 615 | version "0.2.0" 616 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 617 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 618 | 619 | type-check@^0.4.0, type-check@~0.4.0: 620 | version "0.4.0" 621 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 622 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 623 | dependencies: 624 | prelude-ls "^1.2.1" 625 | 626 | type-fest@^0.20.2: 627 | version "0.20.2" 628 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 629 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 630 | 631 | uri-js@^4.2.2: 632 | version "4.4.1" 633 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 634 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 635 | dependencies: 636 | punycode "^2.1.0" 637 | 638 | which@^2.0.1: 639 | version "2.0.2" 640 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 641 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 642 | dependencies: 643 | isexe "^2.0.0" 644 | 645 | word-wrap@^1.2.3: 646 | version "1.2.3" 647 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 648 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 649 | 650 | wrappy@1: 651 | version "1.0.2" 652 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 653 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 654 | 655 | yocto-queue@^0.1.0: 656 | version "0.1.0" 657 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 658 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 659 | --------------------------------------------------------------------------------